假设我们有一个带有一个子视图的视图控制器。子视图占据屏幕的中心,四周有 100 px 的边距。然后,我们在该子视图中添加了一些小东西来点击。我们只是使用子视图来利用新框架(子视图中的 x=0, y=0 实际上是父视图中的 100,100)。
然后,想象我们在子视图后面有一些东西,比如菜单。我希望用户能够在子视图中选择任何“小东西”,但如果那里什么都没有,我希望触摸通过它(因为无论如何背景都是清晰的)到它后面的按钮。
我怎样才能做到这一点?看起来 touchesBegan 通过了,但按钮不起作用。
为您的容器创建一个自定义视图并覆盖 pointInside: 消息以在该点不在符合条件的子视图中时返回 false,如下所示:
迅速:
class PassThroughView: UIView { override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { for subview in subviews { if !subview.isHidden && subview.isUserInteractionEnabled && subview.point(inside: convert(point, to: subview), with: event) { return true } } return false } }
目标 C:
@interface PassthroughView : UIView @end @implementation PassthroughView -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { for (UIView *view in self.subviews) { if (!view.hidden && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) return YES; } return NO; } @end
将此视图用作容器将允许其任何子级接收触摸,但视图本身将对事件透明。