将点击手势添加到任何视图都不会触发任何内容
Adding Tap Gesture to any view triggers nothing
到目前为止,我正在处理 iOS 开发过程中最令人沮丧的一个问题。我最初试图在我的 UIImage
视图中添加一个手势识别器,但没有成功。我在堆栈上进行了一些搜索,发现我没有设置 imageView.isUserInteractionEnabled = true
,我认为这可以解决我的问题,但事实并非如此。因此,我开始向包括 imageView
的父视图在内的所有内容添加手势识别器,但仍然一无所获。我确信我 doing/haven 没有完成的事情是如此简单,但我完全错过了它。请帮忙。
ProfileViewController: UIViewController {
// User's info container (Parent iof imageView)
let userInfoContainer: UIView = {
let head = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
head.backgroundColor = UIColor.white
head.translatesAutoresizingMaskIntoConstraints = false
head.layer.borderWidth = 1
print(head.isUserInteractionEnabled) // Returns true
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
head.addGestureRecognizer(tap)
return head
}()
// Users name
let userName: UITextField = {
let name = UITextField()
name.text = "John Doe"
name.translatesAutoresizingMaskIntoConstraints = false
name.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
name.addGestureRecognizer(tap)
return name
}()
// User's profile image
let profileImageView: UIImageView = {
let imageView = UIImageView(image: #imageLiteral(resourceName: "avatar"))
imageView.layer.cornerRadius = 50
imageView.layer.masksToBounds = true
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
return imageView
}()
//
//
// skipping other UI elements
//
//
override func viewDidLoad() {
super.viewDidLoad()
// Authentication bits
self.title = "Profile View"
self.view.backgroundColor = UIColor.white
self.view.addSubview(userInfoContainer)
self.view.addSubview(profileImageView)
self.view.addSubview(userName)
} // end viewDidLoad
func tapped() {
print(123)
}
// setup constraints
func setupUserInfoContainer() {
userInfoContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
userInfoContainer.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
userInfoContainer.heightAnchor.constraint(equalToConstant: 200).isActive = true
}
// profile image arrangement
func setupProfileImage() {
profileImageView.leftAnchor.constraint(equalTo: userInfoContainer.leftAnchor, constant: 20).isActive = true
profileImageView.centerYAnchor.constraint(equalTo: userInfoContainer.centerYAnchor).isActive = true
profileImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true
profileImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true
}
func setupLabels() {
userName.leftAnchor.constraint(equalTo: profileImageView.rightAnchor, constant: 20).isActive = true
userName.centerYAnchor.constraint(equalTo: profileImageView.centerYAnchor).isActive = true
userName.heightAnchor.constraint(equalToConstant: 20).isActive = true
userName.isEnabled = false
}
} // end view controller
渲染视图:
查看层次结构
可能 不需要的额外信息:ProfileViewController 由 UITabBarController 处理,但据我所见,这应该没有什么不同。
更新
环顾四周,看起来合适的 swift 3 语法是
let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapped(_:)))
但我认为在闭包中包含该行是导致抛出此错误的原因 ../ProfileViewController.swift:37:74: Value of type '(NSObject) -> () -> ProfileViewController' has no member 'tapped'
如果有人能解释我如何解决这个问题,那就太棒了。
问题是您没有将委托设置为点击手势。检查 this
希望这会奏效
我不相信你可以用这种方式分配手势识别器...
1 let profileImageView: UIImageView = {
2 let imageView = UIImageView(image: #imageLiteral(resourceName: "avatar"))
3 imageView.layer.cornerRadius = 50
4 imageView.layer.masksToBounds = true
5 imageView.translatesAutoresizingMaskIntoConstraints = false
6 imageView.isUserInteractionEnabled = true
7 imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
8 return imageView
9 }()
第 7 行,self
是什么?返回 UIImageView
.
的是 函数
您的 func tapped()
不是该函数的一部分...它属于 ProfileViewController
。
您可能 能够找到改变目标的方法,但我尝试了几分钟不同的方法并没有带来任何好运。
我认为您需要在 ProfileViewController / viewDidLoad()
内(或 class 内的其他地方)创建并添加 GestureRecognizer。
你为什么不在 class 的顶部初始化你的图像视图,比如
let profileImageView = UIImageView()
并创建一个函数来配置 imageview 并将其添加为子视图,以便在视图中加载。这应该有效
func configureImageView() {
#add methods and customize image view
#add image view to sub view
}
到目前为止,我正在处理 iOS 开发过程中最令人沮丧的一个问题。我最初试图在我的 UIImage
视图中添加一个手势识别器,但没有成功。我在堆栈上进行了一些搜索,发现我没有设置 imageView.isUserInteractionEnabled = true
,我认为这可以解决我的问题,但事实并非如此。因此,我开始向包括 imageView
的父视图在内的所有内容添加手势识别器,但仍然一无所获。我确信我 doing/haven 没有完成的事情是如此简单,但我完全错过了它。请帮忙。
ProfileViewController: UIViewController {
// User's info container (Parent iof imageView)
let userInfoContainer: UIView = {
let head = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
head.backgroundColor = UIColor.white
head.translatesAutoresizingMaskIntoConstraints = false
head.layer.borderWidth = 1
print(head.isUserInteractionEnabled) // Returns true
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
head.addGestureRecognizer(tap)
return head
}()
// Users name
let userName: UITextField = {
let name = UITextField()
name.text = "John Doe"
name.translatesAutoresizingMaskIntoConstraints = false
name.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
name.addGestureRecognizer(tap)
return name
}()
// User's profile image
let profileImageView: UIImageView = {
let imageView = UIImageView(image: #imageLiteral(resourceName: "avatar"))
imageView.layer.cornerRadius = 50
imageView.layer.masksToBounds = true
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
return imageView
}()
//
//
// skipping other UI elements
//
//
override func viewDidLoad() {
super.viewDidLoad()
// Authentication bits
self.title = "Profile View"
self.view.backgroundColor = UIColor.white
self.view.addSubview(userInfoContainer)
self.view.addSubview(profileImageView)
self.view.addSubview(userName)
} // end viewDidLoad
func tapped() {
print(123)
}
// setup constraints
func setupUserInfoContainer() {
userInfoContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
userInfoContainer.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
userInfoContainer.heightAnchor.constraint(equalToConstant: 200).isActive = true
}
// profile image arrangement
func setupProfileImage() {
profileImageView.leftAnchor.constraint(equalTo: userInfoContainer.leftAnchor, constant: 20).isActive = true
profileImageView.centerYAnchor.constraint(equalTo: userInfoContainer.centerYAnchor).isActive = true
profileImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true
profileImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true
}
func setupLabels() {
userName.leftAnchor.constraint(equalTo: profileImageView.rightAnchor, constant: 20).isActive = true
userName.centerYAnchor.constraint(equalTo: profileImageView.centerYAnchor).isActive = true
userName.heightAnchor.constraint(equalToConstant: 20).isActive = true
userName.isEnabled = false
}
} // end view controller
渲染视图:
更新
环顾四周,看起来合适的 swift 3 语法是
let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapped(_:)))
但我认为在闭包中包含该行是导致抛出此错误的原因 ../ProfileViewController.swift:37:74: Value of type '(NSObject) -> () -> ProfileViewController' has no member 'tapped'
如果有人能解释我如何解决这个问题,那就太棒了。
问题是您没有将委托设置为点击手势。检查 this
希望这会奏效
我不相信你可以用这种方式分配手势识别器...
1 let profileImageView: UIImageView = {
2 let imageView = UIImageView(image: #imageLiteral(resourceName: "avatar"))
3 imageView.layer.cornerRadius = 50
4 imageView.layer.masksToBounds = true
5 imageView.translatesAutoresizingMaskIntoConstraints = false
6 imageView.isUserInteractionEnabled = true
7 imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
8 return imageView
9 }()
第 7 行,self
是什么?返回 UIImageView
.
您的 func tapped()
不是该函数的一部分...它属于 ProfileViewController
。
您可能 能够找到改变目标的方法,但我尝试了几分钟不同的方法并没有带来任何好运。
我认为您需要在 ProfileViewController / viewDidLoad()
内(或 class 内的其他地方)创建并添加 GestureRecognizer。
你为什么不在 class 的顶部初始化你的图像视图,比如
let profileImageView = UIImageView()
并创建一个函数来配置 imageview 并将其添加为子视图,以便在视图中加载。这应该有效
func configureImageView() {
#add methods and customize image view
#add image view to sub view
}