UIViewにはビュー階層を表示するためのプライベートメソッドrecursiveDescription
があるので、これを使います。
このメソッドを呼び出すと、以下のようにビュー階層をログ出力してくれます。
<UIView: 0x7ff192717cc0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x7ff19264f0d0>; layer = <CALayer: 0x7ff192717d90>>
| <UIView: 0x7ff1927198e0; frame = (0 60; 320 183); autoresize = RM+BM; layer = <CALayer: 0x7ff1927199b0>>
| | <UITextField: 0x7ff192656c40; frame = (8 57; 304 30); text = '1'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ff1926596a0>; layer = <CALayer: 0x7ff1926570e0>>
| | | <UIButton: 0x7ff19266cd10; frame = (280 6; 19 19); opaque = NO; layer = <CALayer: 0x7ff19266c950>>
| | | | <UIImageView: 0x7ff192677260; frame = (2.5 2.5; 14 14); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7ff192677360>>
.
.
.
デバッガからrecursiveDescription
を実行する方法とコード内で呼び出す方法がありますが、ブレークさせたくない場合はコードに記述することになるでしょう。
##デバッガからコマンド実行する方法
ブレークで止めた後、デバッグコンソールから以下を実行(po以降を入力)します。階層表示するビューは適宜変更してください。
(lldb) po [self.view recursiveDescription]
##コードから実行する方法
NSLog(@"%@", [self.view recursiveDescription]); // error
NSLog(@"%@", [self.view performSelector:@selector(recursiveDescription)]); // warning
これだけだとメソッドが見つからないので怒られてしまいます(プライベートメソッドなので)。
カテゴリでメソッドを追加(宣言のみ)したうえで上記呼び出しを行えうことで怒りを鎮めることができます。
@interface UIView (debug) //無名カテゴリでもよいです
- (NSString *)recursiveDescription;
@end
※ プライベートメソッドなので、リリースビルド時には使わないようにしましょう。
##参考
Technical Note TN2239: iOS Debugging Magic
UIView implements a useful description method. In addition, it implements a recursiveDescription method that you can call to get a summary of an entire view hierarchy.