Skip to content

Instantly share code, notes, and snippets.

@spinogrizz
Last active December 22, 2015 08:59
Show Gist options
  • Save spinogrizz/6449047 to your computer and use it in GitHub Desktop.
Save spinogrizz/6449047 to your computer and use it in GitHub Desktop.
Two common used methods to find a subview of any given (private) class inside some view hierarchy, or just dump all views in a pretty-print format using NSLog.
//
// UIViewHierarchy.h
//
// Created by Denis Gryzlov on 09.08.13.
// Copyright (c) 2013 Armada. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIView (Hierarchy)
- (UIView *) findSubviewOfClass:(Class)someClass;
- (void) dumpViewHierarchy;
@end
//
// UIViewHierarchy.m
//
// Created by Denis Gryzlov on 09.08.13.
// Copyright (c) 2013 Armada. All rights reserved.
//
#import "UIViewHierarchy.h"
@implementation UIView (Hierarchy)
- (UIView *) findSubviewOfClass:(Class)someClass {
if ( [self isMemberOfClass:someClass] ) {
return self;
} else {
for ( UIView *view in self.subviews ) {
UIView *insideView = [view findSubviewOfClass:someClass];
if ( insideView != nil ) {
return insideView;
}
}
}
return nil;
}
- (void) dumpViewHierarchy {
int level = 0;
[self _logViewHierarchyWithLevel:&level];
}
- (void) _logViewHierarchyWithLevel:(int *)level {
NSMutableString *paddingStr = [NSMutableString new];
for (int i = 0; i < *level; i++) {
[paddingStr appendString:@" "];
}
NSLog(@"%@%@", paddingStr, self);
*level = *level + 1;
for ( UIView *subview in self.subviews ) {
if ( subview.subviews.count > 0 ) {
[subview _logViewHierarchyWithLevel:level];
}
else {
NSLog(@"%@> %@", paddingStr, subview);
}
}
}
@end
@spinogrizz
Copy link
Author

Output example:

<UIWindow: 0x210e9cb0; frame = (0 0; 768 1024); tag = 5002; layer = <UIWindowLayer: 0x210efef0>>
    <UIView: 0x210e5cb0; frame = (0 0; 768 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x210c4370>>
       <UIView: 0x210841b0; frame = (0 0; 1024 768); autoresize = W+H; layer = <CALayer: 0x210f02a0>>
          <MPVideoContainerView: 0x1fd5bb50; frame = (0 0; 1024 768); autoresize = W+H; gestureRecognizers = <NSArray: 0x210f09b0>; layer = <CALayer: 0x1fd5bc00>>
             <MPVideoBackgroundView: 0x1fd5b5e0; frame = (0 0; 1024 768); autoresize = W+H; tag = 1000; layer = <CALayer: 0x1fd5b6b0>>
             > <UIView: 0x1fd5b8f0; frame = (0 0; 1024 768); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x1fd5b950>>
          > <UIView: 0x1fd5b4d0; frame = (0 0; 1024 768); autoresize = W+H; tag = 1001; layer = <CALayer: 0x1fd5b530>>
          > <MPVideoView: 0x210c8210; frame = (0 0; 1024 768); autoresize = W+H; userInteractionEnabled = NO; tag = 1002; layer = <AVPlayerLayer: 0x210c6a30>>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment