Обход иерархии представлений на iPhone или iPad

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

Эта подпрограмма сбрасывает иерархию представлений на NSLog(), начиная с переданного представления. Подпредставления показывают свой индекс в массиве подпредставлений и все суперклассы в порядке, разделенном двоеточием с размером кадра в конце.

Чтобы сбросить всю иерархию представлений вашего приложения, вызовите метод следующим образом:

dumpViews([[UIApplication sharedApplication] keyWindow], @"", @"");

Чтобы отобразить иерархию вида камеры, переопределите этот метод в вашем контроллере: navigationController:willShowViewController:viewController:animated:

и вызовите процедуру дампа следующим образом:

dumpViews(self.modalViewController.view, @"", @"");

Для всех остальных представлений:

dumpViews(myView, @"", @"");


Источник

void dumpViews(UIView* view, NSString *text, NSString *indent) 
{
    Class cl = [view class];
    NSString *classDescription = [cl description];
    while ([cl superclass]) 
    {
        cl = [cl superclass];
        classDescription = [classDescription stringByAppendingFormat:@":%@", [cl description]];
    }

    if ([text compare:@""] == NSOrderedSame)
        NSLog(@"%@ %@", classDescription, NSStringFromCGRect(view.frame));
    else
        NSLog(@"%@ %@ %@", text, classDescription, NSStringFromCGRect(view.frame));

    for (NSUInteger i = 0; i < [view.subviews count]; i++)
    {
        UIView *subView = [view.subviews objectAtIndex:i];
        NSString *newIndent = [[NSString alloc] initWithFormat:@"  %@", indent];
        NSString *msg = [[NSString alloc] initWithFormat:@"%@%d:", newIndent, i];
        dumpViews(subView, msg, newIndent);
        [msg release];
        [newIndent release];
    }
}




Пример дампа камеры

UIView:UIResponder:NSObject {{0, 0}, {320, 480}}
  0: PLCameraView:UIView:UIResponder:NSObject {{0, 0}, {320, 480}}
    0: UIView:UIResponder:NSObject {{0, 0}, {320, 427}}
    1: UIImageView:UIView:UIResponder:NSObject {{10000, 10000}, {320, 480}}
    2: UIView:UIResponder:NSObject {{0, 427}, {320, 53}}
    3: PLCropOverlay:UIView:UIResponder:NSObject {{0, 0}, {320, 480}}
      0: UIImageView:UIView:UIResponder:NSObject {{0, 20}, {320, 96}}
      1: PLCropLCDLayer:UIView:UIResponder:NSObject {{0, 20}, {320, 96}}
      2: TPBottomDualButtonBar:TPBottomButtonBar:TPBottomBar:UIView:UIResponder:NSObject {{0, 384}, {320, 96}}
        0: TPPushButton:UIThreePartButton:UIPushButton:UIControl:UIView:UIResponder:NSObject {{22, 26}, {128, 47}}
        1: TPCameraPushButton:TPPushButton:UIThreePartButton:UIPushButton:UIControl:UIView:UIResponder:NSObject {{170, 26}, {128, 47}}
          0: UIImageView:UIView:UIResponder:NSObject {{51, 12}, {26, 19}}

person Sophtware    schedule 15.04.2009    source источник
comment
Я спросил в Meta о том, что нам делать с этим вопросом: meta.stackoverflow.com/q/378604/1709587. Вы можете взвеситься там.   -  person Mark Amery    schedule 05.01.2019
comment
Вам разрешено и даже поощряется самостоятельно решать свои проблемы, и сообщество считает это полезным, но, учитывая, что этот сайт сайт вопросов и ответов (не блог и т. д.), рассмотрите возможность его исправления в соответствии с форматом этого сайта, отредактировав вопрос, включив в него фоновую проблему, а затем переместив ответ в вопросе в ответ (конечно, когда вопрос был повторно открыт ). В противном случае у других людей может сложиться неправильное впечатление, что они могут делиться здесь любым кодом без какой-либо причины.   -  person Andrew T.    schedule 05.01.2019