Обновлено
hitTest
не будет работать, так как не даст вам поддеревьев, если родительский элемент имеет userInteractionEnabled
, установленный на NO
, или представление, которое находится за пределами родительских границ.
visibleViewAtPoint
, как описано ниже, проанализирует все дерево представлений и даст представление с самым высоким индексом подпредставления. Это должно дать правильное представление (не принимая во внимание z-порядок ...)
- (void) findView:(UIView**)visibleView atPoint:(CGPoint)pt fromParent:(UIView*)parentView
{
UIView *applicationWindowView = [[[[UIApplication sharedApplication] keyWindow] rootViewController] view];
if(parentView == nil) {
parentView = applicationWindowView;
}
for(UIView *view in parentView.subviews)
{
if((view.superview != nil) && (view.hidden == NO) && (view.alpha > 0))
{
CGPoint pointInView = [applicationWindowView convertPoint:pt toView:view];
if([view pointInside:pointInView withEvent:nil]) {
*visibleView = view;
}
[self findView:visibleView atPoint:pt fromParent:view];
}
}
}
- (UIView*) visibleViewAtPoint:(CGPoint)pt
{
UIView *visibleView = nil;
[self findView:&visibleView atPoint:pt fromParent:nil];
return visibleView;
}