Получить видимый вид в определенной точке - PullRequest
1 голос
/ 26 августа 2011

У меня есть точка CGPoint в координатах окна приложения.
Есть ли способ получить указатель на вид, видимый в этой точке?

Например, у меня есть 100 видов или случайных размеров и помещеныв случайных местах - некоторые частично / полностью перекрывают друг друга.
Нажатие кнопки в приложении отобразит адрес вида, видимого в (0,0), (100,100) и (200,200).
В представлениях может быть включено или не включено userInteraction.
Также, а как насчет более сложного сценария, когда представление покрыто полностью прозрачным представлением?

1 Ответ

7 голосов
/ 26 августа 2011

Обновлено
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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...