Swift 3检查用户点击图像的时间

tee*_*tee 5 ios swift

所以我在我的应用程序中显示了一个图像,我正在使用Xcode快速创建,并且我希望例如在点击图像时打印"Image Clicked".这是我得到的:

这是一个假设每当用户点击图像时被调用的函数:

func imageViewTapped(imageView: UIImageView) {
    print("Image Clicked")
}
Run Code Online (Sandbox Code Playgroud)

我有这个功能,可以添加用户与图像的交互:

func tapRecognition(image: UIImageView) {
    image.isUserInteractionEnabled = true
    let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector(("imageViewTapped:")))
    image.addGestureRecognizer(tapRecognizer)
}
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的是,我在viewDidLoad()函数中创建了一个UIImageView类型的图像,我调用了:

tapRecognition(image: imageView)
Run Code Online (Sandbox Code Playgroud)

当我运行它并单击图像时,我收到一个错误,指出:"以NSException类型的未捕获异常终止".任何帮助都会很棒!非常感谢.

dfd*_*dfd 11

这里有一些代码可以使用Swift 3:

override func viewDidLoad() {
    super.viewDidLoad()

    // #1
    let myImage = UIImage(named: "myImage")
    let imageView = UIImageView()
    imageView.image = myImage

    // #2
    imageView.isUserInteractionEnabled = true
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
    imageView.addGestureRecognizer(tapRecognizer)

    // #3
    imageView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(imageView)
    // set imageView contraints

}

// #4
func imageTapped(recognizer: UITapGestureRecognizer) {
    print("Image was tapped")
    let thePoint = recognizer.location(in: view)
    let theView = recognizer.view
}
Run Code Online (Sandbox Code Playgroud)
  • 1虽然你的代码有点不同而有些缺失,但我相信这基本相同.除非您需要访问imageimageView在其他地方,请在本地声明它们viewDidLoad.(我建议不要UIImageView像你那样命名(image),因为这会让其他人在阅读你的代码时感到困惑.)

  • 2这就是我认为@rmaddy是正确的.如果您使用的是Swift 3,那么选择器的正确语法就是我所拥有的.这可能是我们的代码唯一的问题 - 并且值得记住a UIImageView的默认值为isUserInteractioEnabled = true.

  • 3您没有任何实际布局代码.但是如果使用自动布局(而不是框架),则基本语法将关闭自动调整,确保将视图添加到视图层次结构中,并设置约束.很多时候(大多数情况下)你可以设置它们viewDidLoad,但是如果你需要帧信息,请使用viewWillLayoutSubviews或者viewDidLayoutSubviews.

  • 4起初我认为您的水龙头功能还可以,但经过进一步检查,它不是.发件人不是被点击的视图,它是识别器.我在print语句后添加了两行代码.第一个将CGPointtap的变量放入变量中.第二个将UIView附加到识别器(在这种情况下imageView)放入变量中.此外,如果您需要知道是imageView在水龙头区域的子视图,请使用该hitTest()方法.

编辑:

我被问到如何imageView在点击时执行的函数中使用视图(在我的示例中).

首先,你不能做的一件事是将它作为参数传递.iOS和macOS都不能以这种方式运行.但是你有(至少)三种选择.(它们都不使用tag属性,在某些情况下是另一种选择.)

  • 1您显示的代码表示您已经知道图像视图已被点击.这可能是一种情况,因为您创建的每个手势只能附加到单个视图.如果这是您的场景,请考虑在视图控制器级别声明图像视图,并在您的函数内编写所需的代码.

  • 2但是,如果您在视图控制器中有两个图像视图,并且附加了一个轻击手势,并且您希望它们根据所拍摄的内容执行某些操作,该怎么办?在这种情况下,您可以使用手势的view属性,并使用强制转换.骨架代码:

    let imageView1 = UIImageView()
    let imageView2 = UIImageView()
    let tapRecognizer1 = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
    imageView1.addGestureRecognizer(tapRecognizer1)
    let tapRecognizer2 = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
    imageView2.addGestureRecognizer(tapRecognizer2)
    
    
    func imageTapped(recognizer: UITapGestureRecognizer) {
        print("Image was tapped")
        let imageView = recognizer.view as? UIImageView
        if imageView != nil {
            //do something here
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,骨架可能在转换中出现语法错误.逻辑是坚实的,我在网上写这个,而不是在Xcode中.基本上将附加的UIView作为图像视图并检查为零.

  • 3如果您有多个子视图并且想要知道哪个子视图被点击,我通常会使用这种情况.在你的情况下,假设你有两个UIImageViews像上面那样,但你有一个水龙头识别器附加到主视图?在这种情况下,您可以使用该hitTest()方法.骨架代码:

    let imageView1 = UIImageView()
    let imageView2 = UIImageView()
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
    imageView1.addGestureRecognizer(self.view)
    
    func imageTapped(recognizer: UITapGestureRecognizer) {
        print("Image was tapped")
        let p = recognizer.location(in: view)
        if imageView1.layer.hitTest(p) != nil {
            // do something here to imageView1
        } else if imageView2.layer.hitTest(p) != nil {
            // do something here to imageView2
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我更喜欢使用图层,但视图也有hitTest()方法.对此的值是一个视图,其中7个子视图可以使用单个手势进行编码,如果您想忽略点击其中3个子视图(以及在主视图上点击),您可以.

    关于最后一个,我有一段时间的小例子项目.它包含一个带有两个彩色标签作为子视图的图像视图.点击任一标签时,计数器会递增.我在1-2个答案中使用了这个,我想我会把它放在GitHub存储库中.随意看看它:带有标签的图像.