LoginSignup
16
17

More than 5 years have passed since last update.

ビューの階層構造をログ出力する

Last updated at Posted at 2014-10-24

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.

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17