【发布时间】:2012-02-20 00:25:03
【问题描述】:
我有一个UIView,上面有4 个按钮,另一个UIView 在按钮视图的顶部。最上面的视图包含一个UIImageView,上面有一个UITapGestureRecognizer。
我试图创建的行为是,当用户点击UIImageView 时,它会在屏幕右下角变小和动画变大之间切换。当它很大时,我希望禁用底部视图上的按钮,当它很小并且在右下角时,我希望将触摸传递给按钮并使它们正常工作。我快到了,但除非我禁用顶视图的UserInteractions,否则我无法让触摸传递到按钮。
我在顶部视图的initWithFrame: 中有这个:
// Add a gesture recognizer to the image view
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
tapGestureRecognizer.cancelsTouchesInView = NO;
[imageView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];
这是我的imageTapped: 方法:
- (void) imageTapped:(UITapGestureRecognizer *) gestureRecognizer {
// Toggle between expanding and contracting the image
if (expanded) {
[self contractAnimated:YES];
expanded = NO;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = NO;
self.exclusiveTouch = NO;
}
else {
[self expandAnimated:YES];
expanded = YES;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = YES;
self.exclusiveTouch = YES;
}
}
使用上面的代码,当图像很大时按钮处于非活动状态,当我触摸图像时它会缩小并且按钮变为活动状态。但是,小图像没有接收到触摸,因此不会展开。
如果我在这两种情况下都设置了self.userInteractionEnabled = YES,那么图像在被触摸时会展开和收缩,但按钮永远不会被触摸并且就像被禁用一样。
是否可以让图像在触摸时展开和收缩,但下方的按钮仅在图像处于收缩状态时才接收触摸?我是不是在这里做了一些愚蠢的事情而遗漏了一些明显的东西?
我要让这个工作变得非常疯狂,所以任何帮助都将不胜感激,
戴夫
更新:
为了进一步测试,我覆盖了 touchesBegan: 和 touchesCancelled: 方法,并在包含 UIImageView 的视图上调用了它们的超级实现。使用上面的代码,touchesCancelled: 永远不会被调用,而touchesBegan: 总是会被调用。
所以看起来视图正在获得触摸,它们只是没有传递到下面的视图。
更新
这是因为响应者链的工作方式吗?我的视图层次结构如下所示:
VC - View1
-View2
-imageView1 (has tapGestureRecogniser)
-imageView2
-View3
-button1
-button2
我认为操作系统首先执行 hitTest,因为 View2 在前面,所以应该得到所有的触摸,并且这些触摸永远不会传递给 View3,除非 View2 的 userInteractions 设置为 NO,在这种情况下,imageView1 也被阻止接收触及。这是它的工作原理吗?有没有办法让 View2 通过它对 View3 的接触?
【问题讨论】:
-
你是如何扩展和收缩你的 imageView 的?编辑:我假设你仍然用你的 imageView 以某种方式覆盖按钮,即使它在视觉上是收缩的。
-
UIImageView 是另一个视图的子视图。正是这个视图覆盖了按钮,当您在我的代码中看到 self 时,它是 UIView 的子类,并将 UIImageView 添加为子类。希望这是有道理的。
-
请参阅 khanlou.com/2018/09/hacking-hit-tests 以获得对此的良好讨论。
标签: iphone ios uiview uiimageview uitapgesturerecognizer