UITapGestureRecognizer 响应不正确的 UIView
Posted
技术标签:
【中文标题】UITapGestureRecognizer 响应不正确的 UIView【英文标题】:UITapGestureRecognizer responding to incorrect UIView 【发布时间】:2015-08-08 05:12:07 【问题描述】:我有一个 100x600 UIView
位于 ViewController
中的主要 UIView
顶部。通常,我想隐藏这个视图。当用户点击几个控件之一时,包括主视图,我取消隐藏子 UIView
。点击主UIView
上的任意位置将隐藏它。
在 viewDidLoad 中,我有以下 UITapGestureRecognizer:
let viewTouch = UITapGestureRecognizer(target: self, action: "viewClicked:")
self.view.addGestureRecognizer(viewTouch)
viewClicked 函数如下所示:
func viewClicked(gestureRecognizer: UIGestureRecognizer)
handleDisplayOfDropdownView()
handleDisplayOfDropdown 函数负责显示和隐藏子UIView
。它所做的只是调整子视图的 alpha,使其可见或不可见。
func handleDisplayOfDropdownView()
UIView.animateWithDuration(0.5, animations:
if !self.dropDownVisible
self.dropDownVisible = true
self.dropDownView.alpha = 1.0
else
self.dropDownVisible = false
self.dropDownView.alpha = 0
)
所有的 UI 工作都由故事板完成。我只是在 ViewController 的顶部放置了一个 100x600 的视图。通过点击主 UIView 使其可见和隐藏。
我遇到的问题是子 UIView
在我点击它时消失了。当我设置UITapGestureRecognizer
时,我认为只有点击主UIView
才能激活并隐藏它。似乎在任何地方点击,包括子UIView
都会隐藏它。
我是否错误地设置了UITapGestureRecognizer
?
【问题讨论】:
您需要检查子视图框架中是否带有触摸点。如果是,则隐藏子视图,否则取消隐藏。 【参考方案1】:添加手势代理:
UIGestureRecognizerDelegate
在 ViewDidLoad 中设置 viewTouch UITapGesture 委托:
viewTouch.delegate = self
然后调用这个委托
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool
let p = touch.locationInView(view)
if CGRectContainsPoint(dropDownView.frame, p)
return false
return true
【讨论】:
完美运行。谢谢。我确实对gestureRecognizer 做了一个小的修改。我添加了以下内容:` if !dropDownVisible return true ` 这允许我点击视图所在的区域并将其调出,但前提是当前未显示视图。感谢您的帮助!以上是关于UITapGestureRecognizer 响应不正确的 UIView的主要内容,如果未能解决你的问题,请参考以下文章
UITapGestureRecognizer 不响应父视图外的子视图区域
UITapGestureRecognizer 对动画子视图没有响应
tvos swift spritekit - UITapGestureRecognizer 没有响应
UITapGestureRecognizer 响应不正确的 UIView
如何让 UISwitch 或 UITextField 响应 UITapGestureRecognizer 而无需分别切换/进入编辑模式?