我有一个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:
andtouchesCancelled:
方法,并在包含 UIImageView 的视图上调用了它们的超级实现。使用上面的代码,touchesCancelled:
永远不会调用 并且touchesBegan:
总是调用 。
所以看起来视图正在被触摸,它们只是没有传递到下面的视图。
更新
这是因为响应者链的工作方式吗?我的视图层次结构如下所示:
VC - View1
-View2
-imageView1 (has tapGestureRecogniser)
-imageView2
-View3
-button1
-button2
我认为操作系统首先执行 hitTest,因为 View2 在前面,所以应该得到所有的触摸,并且这些触摸永远不会传递给 View3,除非 View2 的 userInteractions 设置为 NO,在这种情况下,imageView1 也被阻止接收触摸。这是它的工作原理吗? View2 有没有办法通过它对 View3 的接触?