点击手势事件在 UIView 上不起作用
Posted
技术标签:
【中文标题】点击手势事件在 UIView 上不起作用【英文标题】:Tap gesture event not working on UIView 【发布时间】:2017-09-15 04:25:05 【问题描述】:我正在尝试向 UIView 添加轻击手势,但该手势未被识别。
"iconBadgeView" 是一个 UIView,其图像的大小已在参数中传递。
lazy var cardioVascularIcon : IconBadgeView! =
let iconBadgeView = IconBadgeView(frame: CGRect(x: 0, y: 0, width: 95, height: 95), data:["big":"db_history"])
let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:)))
tapEvent.numberOfTapsRequired = 1
iconBadgeView.translatesAutoresizingMaskIntoConstraints = false
iconBadgeView.isUserInteractionEnabled = true
iconBadgeView.addGestureRecognizer(tapEvent)
()
有一个委托器附加到同一个类,函数实现如下:
func loadNewView(sender: UITapGestureRecognizer)
print("Tapped")
函数 loadNewView 没有被调用。我不确定代码中有什么问题。如果有人可以提供帮助,请。
我将 iconBadgeView 添加到 superview 如下:
override init(frame: CGRect)
super.init(frame: CGRect.zero)
addSubview(cardioVascularIcon)
cardioVascularIcon.pinToSuperview([.Top])
cardioVascularIcon.pinToSuperview([.Left], constant: 92)
cardioVascularIcon.pinToSuperview([.Right], constant: 92)
【问题讨论】:
let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) tapEvent.addTarget(iconBadgeView, action: #selector(loadNewView(sender:)))
你为什么要在这里重复自己,我的朋友哈哈。如果您要创建一个带有default constructor
意思是UITapGestureRecognizer()
的手势,那么您需要将您的选择器提供给该方法addTarget
,但是由于您使用的是带有选择器和目标的自定义构造函数,因此需要拥有它第二行代码:)
我试过删除重复的行,但没有帮助
您是否遇到任何错误/问题?只是出于好奇,您是否将 iconBadgeView
添加到您的 superView 中?另外,由于您禁用了translatesAutoresizingMaskIntoConstraints
,请确保您将这些约束添加到它,如果现在您可能认为您在屏幕上查看并且它不是:)
不,我没有收到任何错误。我已经使用 addsubView 逻辑更新了问题。
让 tapGesture : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.recognizeTap(sender:)))。尝试使用这条线
【参考方案1】:
您的 iconBadgeView 消失了,因为它是局部变量。
您必须初始化 heartVascularIcon var。
lazy var cardioVascularIcon : IconBadgeView! =
cardioVascularIcon.frame = CGRect(x: 0, y: 0, width: 95, height: 95)
//here call function which sets data property
let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:)))
tapEvent.numberOfTapsRequired = 1
cardioVascularIcon.translatesAutoresizingMaskIntoConstraints = false
cardioVascularIcon.isUserInteractionEnabled = true
cardioVascularIcon.addGestureRecognizer(tapEvent)
()
【讨论】:
您好,感谢您的回答,但恐怕它没有用。 这是屏幕上可见的视图?缺少将此新视图添加到视图层次结构的代码。 是的,视图在屏幕上可见。【参考方案2】:我找到了解决此问题的方法。我使用了按钮而不是标签,现在一切正常。以下是我正在使用的代码:
func createButton (buttonWidth : CGFloat?, buttonTitle : String?, buttonFont : UIFont?, imageName : String?, buttonColor : UIColor?) -> UIButton
let newButton = UIButton(type: . custom)
newButton.showsTouchWhenHighlighted = false
newButton.translatesAutoresizingMaskIntoConstraints = false
newButton.adjustsImageWhenHighlighted = false
if let title = buttonTitle
newButton.setTitle(title, for: .normal)
if let color = buttonColor
if let _ = newButton.titleLabel
newButton.setTitleColor(color, for: .normal)
if let btnWidth = buttonWidth
newButton.frame = CGRect(x: 0, y: 0, width: btnWidth, height: btnWidth)
newButton.layer.cornerRadius = 0.5 * newButton.bounds.size.width
newButton.clipsToBounds = true
if let img = imageName
newButton.setImage(UIImage(named: img), for: .normal)
if let font = buttonFont
newButton.titleLabel?.font = font
return newButton
let addDiagButton = self.createButton(buttonWidth: nil, buttonTitle: addButtonTitle, buttonFont: UIFont.regularDisplayOfSize(30), imageName: nil, buttonColor: UIColor(red: 111, green: 160, blue: 186))
addDiagButton.addTarget(self, action: #selector(addDiag(sender:)), for: .touchUpInside)
上面的代码有一个通用的函数,它创建一个按钮并附加触发事件。代码运行良好。
为了让它表现得像一个标签点击,我在 createButton 函数中添加了一行。
newButton.adjustsImageWhenHighlighted = false
这将限制单击时按钮的闪烁效果。
【讨论】:
以上是关于点击手势事件在 UIView 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章
UIPanGesture 正在工作,但 UITapGesture 在 UIView 上不起作用