所以我的观点从最低的角度来看是这样的
[L] UIView -> [K] 视图 -> [M] 视图
由于 [K] 在某些情况下位于 [M] 之下,所以当我执行 UIView hitTest: 检查 [L] 时,它总是返回 [M] 视图。
有没有办法从 hitTest: 获得最低的子视图?
谢谢。
我希望我理解你的问题:
你有以下视图层次结构,视图 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.subviews
您anUIView
将最顶层视图作为最后一个对象的所有兄弟姐妹 - 这意味着您将首先遇到视图 1,然后是视图 2
您可以遍历超级视图以找出最上面的视图。
// 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