在 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 中将圆形进度条居中?