0

所以我的观点从最低的角度来看是这样的

[L] UIView -> [K] 视图 -> [M] 视图

我的观点

由于 [K] 在某些情况下位于 [M] 之下,所以当我执行 UIView hitTest: 检查 [L] 时,它总是返回 [M] 视图。

有没有办法从 hitTest: 获得最低的子视图?

谢谢。

4

2 回答 2

1

我希望我理解你的问题:
你有以下视图层次结构,视图 1视图 2覆盖

+ Root View
| - View 1
| - View 2

然后您-[UIView hitTest:withEvent:]根视图上执行,知道该点位于视图 1和视图 2内部。但是此方法返回视图 2,因为它位于顶部。

如果您想获得View 1,则可以使用以下内容:

@implementation UIView (ExtendedHitTest)
- (UIView *)extendedHitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    __block UIView *result;
    NSArray *hitTestSiblings = [self hitTest:point withEvent:event].superview.subviews;
    [hitTestSiblings enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
        if ([view pointInside:[self convertPoint:point toView:view] withEvent:event]) {
            result = view;
            *stop = YES;
        }
    }];
    return result;
}
@end

随着anUIView.superview.subviewsanUIView将最顶层视图作为最后一个对象的所有兄弟姐妹 - 这意味着您将首先遇到视图 1,然后是视图 2

于 2013-06-23T16:57:29.237 回答
0

您可以遍历超级视图以找出最上面的视图。

// Assume self is a UIView. If it's a UIViewController, replace self with self.view
UIView* v = [self hitTest:p withEvent:e];

if (v == self) {
    // The current view has been hit ...
}

while (v.superview != self) {
    v = v.superview;
}

// Now v is the view that you wanted
于 2013-06-24T00:21:41.670 回答