在 UIView 中将 tapGestureRecognizer 添加到 UIImageView 并通过协议调用方法

Posted

技术标签:

【中文标题】在 UIView 中将 tapGestureRecognizer 添加到 UIImageView 并通过协议调用方法【英文标题】:add tapGestureRecognizer to UIImageView in UIView and call method by protocol 【发布时间】:2017-02-17 08:01:29 【问题描述】:

我想在 UIView(blue) 中的 UIImageView(orange) 上识别触摸。并且希望在委托方法中处理触摸事件,该方法将在其他类中使用。但是,我无法使用下面的代码进行识别。如何实现仅在 ImageView(orange) 中识别触摸。

代码:

import UIKit

protocol CustomViewDelegate 
    func imageViewTapped()


class CustomView: UIView 

    var delegate: CustomViewDelegate?
    var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

    override init(frame: CGRect) 
        super.init(frame: frame)
        self.backgroundColor = UIColor.blue
        self.imageView.backgroundColor = UIColor.orange
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tapped))
        imageView.addGestureRecognizer(tapGestureRecognizer)
        self.addSubview(imageView)
    

    public required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    func tapped() 
        print("tapped method called")
        delegate?.imageViewTapped()

    


class ViewController: UIViewController, CustomViewDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()

        let view = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
        view.delegate = self
        self.view.addSubview(view)
    

    func imageViewTapped() 
        print("come to view controller")
    


【问题讨论】:

我发现它几乎可以工作 self.addGestureRecognizer(tapGestureRecognizer) 而不是 imageView.addGestureRecognizer(tapGestureRecognizer)。但是,它识别所有蓝色部分的触摸 为故事板中的图像视图启用 userInteraction。 【参考方案1】:

UIImageView 默认用户交互为 false,所以在 CustomView 初始化中启用 imageView 用户交互。

imageView.isUserInteractionEnabled = true

【讨论】:

【参考方案2】:

将不同的 UITapGestureRecognizer 添加到不同的视图并根据您的要求进行处理。或者像这样添加标签和访问

 func tapOneAct(sender: UITapGestureRecognizer)

    if let tag = sender.view?.tag 
        switch tag 
        case 1:
            println("First View Tapped")
        case 2:
            println("Second View Tapped")
        default:
            println("Nothing Tapped")
        
    


【讨论】:

【参考方案3】:

在 UIImageView 上启用 isUserInteractionEnabled 属性,因为它默认为 false

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(CustomView.tapped(_:))) 
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(tapGestureRecognizer)
self.addSubview(imageView)

tapGesture方法中

func tapgesture(_ sender: UITapGestureRecognizer)
     if sender.state == .ended 
        let touchLocation: CGPoint = sender.location(in: sender.view?.superview)
        if imageView.frame.contains(touchLocation) 
            print("tapped method called")
            delegate?.imageViewTapped()
        
    

【讨论】:

以上是关于在 UIView 中将 tapGestureRecognizer 添加到 UIImageView 并通过协议调用方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ViewController 中将 AVPlayer 添加到 UIView

如何使用 Swift 在 UIView 中将圆形进度条居中?

在哪个观点周期中将子视图添加到 UIView 子类的通用“经验法则”是啥?

如何在 iOS 中将 UIView 转换为 PDF?

如何在 iOS 中将 UIView 转换为 PDF?

如何在iOS中将输出(UIView)导出为指定大小的图像