命中测试位于SuperView边界外的UIButton

时间:2015-10-22 01:45:51

标签: ios cocoa-touch uiview hittest

我正在尝试在ControlsViewtouchUpInsideUIButton设置动画,这是附加图像中白色方块内的胡萝卜字符。当按下按钮时,将触发委托方法,controlsView被动画化。问题是因为UIButton超出了controlsView的范围,所以它不会收到触摸信息。

我已经考虑了很多,并阅读了一些潜在的候选解决方案。例如通过覆盖hitTest:withEvent:来检测超级视图上的触摸事件。但是,UIButton实际上是CockPitView的子视图,它是ControlsView的子视图,是MainView的子视图。看起来,MainView是UIButton真正位于其中的矩形。所以我会覆盖hitTest并将触摸信息传递给CockPitView,然后我可以在那里{ {1}}触发其动作回调?

有没有人遇到过这个或类似的问题,并对如何进行有任何建议?

visual reference

2 个答案:

答案 0 :(得分:1)

您应该在自定义视图hitTest

中覆盖CockPitView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{   
    if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
        for (UIView *subview in self.subviews.reverseObjectEnumerator) {
            CGPoint subPoint = [subview convertPoint:point fromView:self];
            UIView *result = [subview hitTest:subPoint withEvent:event];
            if (result != nil) {
                return result;
            }
        }
    }

    return nil;
}

CockPitView必须是UIView

的子类

答案 1 :(得分:1)

您可能想要使用getline。在-pointInside:withEvent:的超级评论中,即button,覆盖以下方法:

ControlsView

通过这样做,您的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { // self.button is the button outside the bounds of your ControlsView if (CGRectContainsPoint(self.button.bounds, [self convertPoint:point toView:self.button])) { return YES; } return [super pointInside:point withEvent:event]; } 声称您的按钮范围内的点应被视为ControlsView内的点。