添加为另一个视图的子视图时未调用 touchesBegan 方法
Posted
技术标签:
【中文标题】添加为另一个视图的子视图时未调用 touchesBegan 方法【英文标题】:touchesBegan method not called when added as subview of another view 【发布时间】:2016-06-16 00:40:50 【问题描述】:晚上好。 我有两个 ViewController(让我们将它们命名为 A 和 B),都覆盖了 touchesBegan 方法。它是这样工作的:当视图 A 被点击时,B 的视图被添加为 A 的视图的子视图,并且中心位于触摸位置。但是当我在 B 的视图中点击(最近添加)时,不会调用 B 的 touchesBegan。我已经在两个视图中都将 view.enableUserInteraction 设置为 true,并且已经对 nextResponder().touchesBegan 方法进行了失败的测试。我究竟做错了什么 ? Obs:我打算添加 B 的几个视图(宽度=60,高度=60)作为 A 的视图的子视图。
【问题讨论】:
【参考方案1】:这是因为触摸事件是由 A 响应的。您应该在 B 显示时关闭 A 的用户交互。
更新: 试试这个:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
if (!self.clipsToBounds && !self.hidden && self.alpha > 0.01)
for (UIView *subview in self.subviews.reverseObjectEnumerator)
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];
if (result != nil)
return result;
return nil;
【讨论】:
但我必须添加几个 B(宽度 = 60 和高度 = 60)。如果我关闭 A,以后如何添加另一个 B? @BrunoBarros 我很喜欢。您应该覆盖 A 视图的hitTest
。当你发现一个子视图被点击时,你应该传递那个事件。
很好..你能帮我看看怎么做吗?如果您能用一些代码回答,我将不胜感激。 tks
@BrunoBarros 更新了我的答案。
但是当我将 B 的视图添加为 A 的视图的子视图时,B 的视图位于 A 的视图之上。理论上,B 应该通过 touchesBegan 而不是视图的视图来接收触摸A. 我说的对吗?【参考方案2】:
你有两个视图还是两个视图控制器?当您触发加载视图“B”的事件时,请在视图对象上调用 .becomeFirstResponder()
。
【讨论】:
两个 viewControllers 和它们各自的视图 您可能需要将手势识别器添加到您的第二个视图,以便它可以处理点击。let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector()
view.addGestureRecognizer(tap)
然后在选择器中触发您需要的任何方法。
是的..我已经这样做了,而且效果很好。但我只是想知道为什么 touchesBegan 不起作用。但是顺便说一句
我实际上找到了一篇很棒的文章,描述了 Lumailxk 正在谈论的内容,但没有足够的代表评论。如果您想阅读link,请点击此处的链接。每天学习新东西。
tks,@Haligen..我读了这篇文章,仍然很困惑。文章说返回的命中测试视图(在我的情况下它将是 B,因为它覆盖了 A 的视图)处理该事件。但是 A 正在处理事件(我仍然不知道为什么)。如果我在 B 视图中添加点击手势,它可以正常工作。以上是关于添加为另一个视图的子视图时未调用 touchesBegan 方法的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 7 beta 5、Swift 2:UITableViewCell 的子视图在运行时未添加到 contentView
UIToolbarItem 在作为 UIPickerView 的子视图插入时未选择
调用 notifyDataSetChanged 时未更新带有 customAdapter 的 ListView?