2017-06-22 27 views
0

我正在处理iOS开发过程中迄今为止最令人沮丧的问题。我原本是试图添加一个手势识别器到我的UIImage视图,但没有任何运气。我在堆栈上进行了一些搜索,发现我没有设置imageView.isUserInteractionEnabled = true,我认为它可以解决我的问题,但它没有。于是我开始为所有的东西添加手势识别器,包括imageView的父视图,但仍然没有任何东西。我确信我正在做/未做过的事情非常简单,但我完全错过了它。请帮忙。在任何视图中添加点击手势什么也不触发

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 视图层次 ViewHeiarchy 额外的信息,这些信息可能必要:ProfileViewController正在被处理的UITabBarController但是从我所看到的,这不应该有所作为。

更新 环视它看起来像适当的迅速3语法 let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapped(_:))),但我认为有在封闭该行是什么导致抛出../ProfileViewController.swift:37:74: Value of type '(NSObject) ->() -> ProfileViewController' has no member 'tapped'

此错误。如果有人可以解释我是怎么可以解决这将是恒星。

+0

你可以尝试改变点击的签名点击(_发件人:任何),并改变它在选择器点击(_ :)? – Connor

+0

我更改了签名,但仍收到上面列出的错误。 @ConnorG –

+0

检查用户交互是否启用了viewcontoller的视图 – Tiko

回答

1

我不相信你可以用这种方式分配一个手势识别...

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()(或该类别中的其他地方)内创建并添加GestureRecognizer(s)。

+0

啊,所以在上下文我自己在引用UIImageView不是ProfileViewController。将该行拖入viewDidLoad可将引用更改为视图控制器。我的理解是否正确? –

+1

是...... ish :)在你的上下文中,self甚至不是UIImageView ......它是返回UIImageView的*函数*。另一部分,是的......在viewDidLoad“self”里面会引用ViewController。 – DonMag

+0

非常感谢。这么多灯泡就这样开了 –

0

问题是您没有将代表设置为轻按手势。检查this

希望这将工作

+0

这没有奏效。从closure中添加'tap.delegate = self'试图设置'UIGestureRecognizerDelegate? = ProfileViewController' –

0

你为什么不只是initiliaise图像视图在类的顶部像

let profileImageView = UIImageView() 

,并创建配置的ImageView并将其添加为一个子视图,例如考虑做负载的功能。这应该工作

func configureImageView() { 
    #add methods and customize image view 
    #add image view to sub view 
}