UIView的.为什么在其父母的范围之外的子视图没有接触?

dug*_*gla 36 uiview hittest ios

我有一个简单 - 琐碎的 - UIView父/子层次结构.一位家长(UIView).一个孩子(UIButton).父母边界小于孩子的边界,因此孩子的一部分延伸到其父母的边界框之外.

这就是问题:父母的bbox之外的孩子的那些部分没有接触到.只有在父级的bbox内点击才允许子按钮接收触摸.

有人可以建议修复/解决方法吗?

UPDATE

对于那些关注这个问题的人,这里是我实施的@Bastians最优秀答案的解决方案:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {

    BOOL isInside = [super pointInside:point withEvent:event];

    // identify the button view subclass
    UIButton *b = (UIButton *)[self viewWithTag:3232];
    CGPoint inButtonSpace = [self convertPoint:point toView:b];

    BOOL isInsideButton = [b pointInside:inButtonSpace withEvent:nil];

    if (isInsideButton) {

        return isInsideButton;

    } // if (YES == isInsideButton)

    return isInside;        
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*ian 25

问题是响应者链.当你触摸显示屏时,它会从父母一直走到孩子身边.

所以..当你触摸屏幕时,父母会看到触摸超出了它自己的界限,所以孩子们甚至都不会问.

执行此操作的功能是hitTest.如果你有自己的UIView类,你可以覆盖它并自己返回按钮.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)


Tim*_*ber 5

根据Apple\xe2\x80\x99s 自己的文档,我发现执行此操作的最简单、最可靠的方法是覆盖hitTest:withEvent:在剪切视图的超类中进行重写,如下所示:

\n\n
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {\n\n    // Convert the point to the target view\'s coordinate system.\n    // The target view isn\'t necessarily the immediate subview\n    CGPoint pointForTargetView = [self.targetView convertPoint:point fromView:self];\n\n    if (CGRectContainsPoint(self.targetView.bounds, pointForTargetView)) {\n\n        // The target view may have its view hierarchy,\n        // so call its hitTest method to return the right hit-test view\n        return [self.targetView hitTest:pointForTargetView withEvent:event];\n    }\n\n    return [super hitTest:point withEvent:event];\n}\n
Run Code Online (Sandbox Code Playgroud)\n