我有一个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位于最前面,因此应该获得所有触摸,除非将View2的userInteractions设置为NO,否则这些触摸永远都不会传递给View3,在这种情况下,还会阻止imageView1接收触摸。这是如何工作的,View2是否有办法将其传递给View3?