Как ссылаться на «самый верхний» вид? - PullRequest
7 голосов
/ 05 ноября 2011

В iOS программно, как можно найти, что самый верхний UIView?

Другими словами ... какой вид отображается прямо сейчас?

Скажем, у меня есть перо с 3 видами, сложенными друг на друга.Внутри программы я могу удалить вид сверху, если знаю, что это такое.Как я могу узнать, какой вид сверху на перо?

Ответы [ 3 ]

10 голосов
/ 05 ноября 2011

Вы можете иметь много самых популярных видов, потому что вид не должен занимать весь экран.

Если вам нужен самый верхний вид подпредставления просмотра, вы можете позвонить

[yourView subviews];

и возьмите последний (они отображаются в порядке, наиболее передний последний)

[[yourView subviews] objectAtIndex:[[yourView subviews] count]];

изменить: лучше (из комментариев)

[[yourView subviews] lastObject];

Если вы знаете свой отображаемый viewController, просто замените yourView на yourController.view

3 голосов
/ 06 февраля 2013

Или вот так

UIWindow *window = [[UIApplication sharedApplication].keyWindow;
UIView *topMost = [window findTopMostViewForPoint:CGPointMake(100, 100)];

Функции

@implementation UIView (Extra)

- (UIView *)findTopMostViewForPoint:(CGPoint)point
{
    for(int i = self.subviews.count - 1; i >= 0; i--)
    {
        UIView *subview = [self.subviews objectAtIndex:i];
        if(!subview.hidden && CGRectContainsPoint(subview.frame, point))
        {
            CGPoint pointConverted = [self convertPoint:point toView:subview];
            return [subview findTopMostViewForPoint:pointConverted];
        }
    }

    return self;
}

- (BOOL)isTopmostViewInWindow
{
    if(self.window == nil)
    {
        return NO;
    }

    CGPoint centerPointInSelf = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
    CGPoint centerPointOfSelfInWindow = [self convertPoint:centerPointInSelf toView:self.window];
    UIView *view = [self.window findTopMostViewForPoint:centerPointOfSelfInWindow];
    BOOL isTopMost = view == self || [view isDescendantOfView:self];
    return isTopMost;
}

@end
3 голосов
/ 06 февраля 2013

Как это

UIView *topMost = [[self.view subviews] lastObject];
...