UIView – “启用用户交互”的父母,但真正的孩子?

看起来,父视图上的userInteractionEnabled = NO将阻止用户在所有子视图上进行交互。 它是否正确? 有没有办法解决?

这是正确的,父视图上的userInteractionEnabled设置为NO将级联到所有子视图。 如果您需要一些子视图来启用交互function,但不需要其他子视图,则可以将子视图分为两个父视图:一个使用userInteractionEnabled = YES,另一个使用“否”。 然后把这两个父视图放在主视图中。

您可以inheritanceUIView并重写hitTest:withEvent:将触摸事件传递给您指定的视图(_backView):

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView* view = [super hitTest:point withEvent:event]; if(view == self) { view = _backView; } return view; } 

如果触摸事件被这个视图处理,它将被传递给“_backView”(可以是一个IBOutlet,因此可以使用接口生成器来设置)。 如果是由任何子视图处理,只是返回该孩子( [super hitTest:point withEvent:event] ;)

只要您知道您需要传递事件的视图,这个解决scheme就没有问题。 除此之外,不知道它是否有问题,因为我们正在返回一个视图(_backView)不是当前UIView子视图! 但在我的情况下,它工作得很好。

一个更好的解决scheme可能是在UIView背景上禁用触摸中提到的一个, 以便较低视图上的button是可点击的其中提到使用-pointInside:withEvent: 相比以前的解决scheme,它更好的方式,你不需要指定一个'_backView'来接收事件(该事件只是传递到链中的下一个视图)! 缺点可能是我们需要在所有子视图中执行-pointInside:withEvent:虽然可能是微不足道的开销)

我遇到了一个奇怪的情况。 我有一个UIView(调用这个V),它有一个UIButton作为子视图。 调用这个UIButton,buttonX.下面是我用于buttonX的目标/select器的方法。self下面是视图V. sender参数是buttonX.

导致我一个问题的情况是,如果我触摸我的用户界面上的另一个button(在导航栏上,调用此buttonY),然后非常快速地触摸buttonX,其中buttonY行动禁用视图V,我仍然得到触摸事件发送到buttonX.

 - (void) buttonAction: (UIButton *) sender { NSLog(@"superview: %d", sender.superview.userInteractionEnabled); NSLog(@"button itself: %d", sender.userInteractionEnabled); // <snip> } 

这是输出:

2014-12-19 16:57:53.826 MyApp [6161:960615] superview:0
2014-12-19 16:57:53.826 MyApp [6161:960615]button本身:1

也就是说,发生了button操作,button的超级视图禁止了用户交互! 而子视图仍然有用户交互启用!

对于那些你认为这似乎是人为的,在我的应用程序的用户界面上运行的iPad(运行iOS 8.1.2),这是在我使用该应用程序意外。 这不是我最初试图产生的东西。

思考?

我目前的解决方法如下,但它是必要的,似乎很奇怪!

 - (void) buttonAction: (id) sender { NSLog(@"superview: %d", sender.superview.userInteractionEnabled); NSLog(@"button itself: %d", sender.userInteractionEnabled); if (! self.userInteractionEnabled) return; // <snip> }