iOSでビュー階層を検査するにはどうすればよいですか?


170

iOSアプリのビュー階層を検査するGUIツールはありますか?WebkitのWebインスペクターまたは同様のツールについて考えています。ビューの位置やサイズが間違っている、または子が親に適切に含まれていないなど、レイアウトの問題をデバッグしようとしています。現在、これらのさまざまな条件を手動でテストするか、さまざまなビューにさまざまな背景色を設定するアサーションを追加する必要があります。ご想像のとおり、これは非常に面倒な方法です。

Instrumentsのを調べましたUI recorderが、それはUIアクションのみを記録および再生するものであり、いずれにしてもMacアプリでのみ機能します。

より良い解決策はありますか?

回答:


168

Xcode 6には、Reveal AppやSpark Inspectorなどの3Dビュー階層検査が組み込まれています。

ここに画像の説明を入力してください

アプリの実行中に[ビューの階層をデバッグ]ボタンをクリックして、実行を一時停止し、現時点でのビューを調べます。

ここに画像の説明を入力してください

詳しくはAppleのドキュメントをご覧ください。


5
デバッグの表示オプションが使用できない場合は、stackoverflow.com / questions / 24040322 /…を参照してください。
kennytm 2014

アプリにデバッグ出力がない場合、Xcodeウィンドウの最下部にあるため、最初はLevi McCallumによって表示されるツールバーは表示されませんでした。ボタンを押すと、下部にあるボタンの1つを押すか、スライダーの1つを調整するまで、[階層の表示]ウィンドウは空白のままでした。
カールスミス

このツールに依存し始めると、それは常に失敗します。理由や修正方法はわかりませんが、より複雑なビューで発生するようです。
デパルタメントB

263

GUIビュー検査ツールがあるかどうかはわかりませんが、UIViewのデバッグ方法で運が良かったです。 -recursiveDescription

デバッガーでプログラムを一時停止し、これをGDBに入力した場合(編集:LLDBでも機能します)

po [[UIWindow keyWindow] recursiveDescription]

ビュー階層全体のプリントアウトが得られます。特定のビューでそれを呼び出して、そのビューのビュー階層のプリントアウトを取得することもできます。

そこから得られる情報を確認するのは少し面倒かもしれませんが、それは私にとって便利であることがわかりました。

クレジットは、この方法について述べたこのブログ投稿にリンクされています。また、この役立つ記事にもリンクしていますが、アップルのテクニカルノートを見つけるのは困難です。


1
私は持っています:エラー: '$ __ lldb_objc_class'のインターフェイス宣言が見つかりませんか?(lldb)po [[UIWindow keyWindow] recursiveDescription]エラー: '$ __ lldb_objc_class'のインターフェース宣言が見つかりませんエラー: '$ __ lldb_objc_class'のインターフェース宣言が見つかりませんエラー:式を解析する2つのエラー
Zennichimaro

1
「GUIツールはありますか?」という質問に直接答えるGUIツールが利用できるようになったため、この答えはもはや正解ではないと思います。
レイヴン2013

xcode 5.1以降、recursiveDescriptionエラーを入力するたびにこのエラーが発生し始めました:インスタンスメソッド 'undoManager'には異なる翻訳単位( 'id'と 'NSUndoManager *')で互換性のない結果タイプがあります注:インスタンスメソッド 'undoManager'もここでエラーを宣言しました:式の解析中に1つのエラーが発生しました
省略

1
質問は古く、グラフィカルな方法について尋ねていますが、この特定の答えはテキストによる解決策に関連しています。正規のコード内ソリューションの説明は、たとえばここにあります:stackoverflow.com/a/14193682/2431627。つまり、KVC経由で_printHierarchyプロパティを使用します。
Robin Macharg、2018年

46

アプリのスクリーンショットを明らかにする

奇妙なことに、今では別のオプションhttp://revealapp.com/があります。これは、この投稿の時点でオープン(無料)ベータ版です。ご覧のとおり、これは別の視覚的なインスペクタです。

EDIT 2014-04-05:Revealはベータ版ではなくなり、無料ではなくなりました。ただし、30日間の試用版があります。


1
私はこれのためにいくつかのツールを試しました(Spark Inspector、iOS Hierarchy Viewer、FrankテストツールのFirebugのようなビュー)。これまでのところ、Revealは私のお気に入りです。
2013

1
しかし、それでも価値はあります。ビューを表示するための組み込みのXcodeツールよりもはるかに優れています
Will Larche 2014

35

この質問は古いですが、私が開発した新しいツールに関する情報をここに入力させてくださいhttps : //github.com/glock45/iOS-Hierarchy-Viewer ここに画像の説明を入力してください


シミュレータで別のビューに移動したときにページを自動的に更新することはできますか?さらに、このビューアで値を変更することは可能ですか(実際のコードを記述せずにブラウザでテストを実行できます)?おかげで:)
ブライアン

1
@ブライアン、脳に感謝。値を変更する可能性のプロトタイプを作成し始めました。公式リリースではオフになっています。乞うご期待 !
ダミアンKołakowski

提案をありがとうございました。このツールで問題を解決できました。XcodeのUIデバッガーを使用しても解決できなかった問題です。
D6mi 2016

ありがとう、Damian、しかしこれを読んでいる人にとって、このツールはメンテナンスされていないようです。
Vaddadi Kartick 2017



6

無料:これをインスペクターに入力するだけです:

po [[UIWindow keyWindow] recursiveDescription]

コマーシャル:http : //revealapp.com/ Revealappのベータ版をテストしましたが、バグはありましたが問題ありませんでした。別の商用ツール:http : //sparkinspector.com/シームレスに動作します。


Spark Inspectorには素晴らしい通知ビューアがあります
thierryb 2014年

6

スウィフト4。

iOS

extension UIView {

   // Prints results of internal Apple API method `recursiveDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("recursiveDescription"))))
   }
}

macOS

extension NSView {

   // Prints results of internal Apple API method `_subtreeDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("_subtreeDescription"))))
   }
}

使用法(デバッガーで): po myView.dump()


2

これはすべてデバッグウィンドウにダンプします。(読みづらい):(iOS 10、Xcode 8.3.3で動作しています。

po UIApplication.shared.keyWindow?.recursiveDescription()

0

Xcode 8とSwift 2.3 を使用すると、承認された回答が機能しなくなります。これが私にとって何がうまくいくかです:

po UIApplication.sharedApplication().keyWindow?.recursiveDescription()


1
ありがとう、mph、しかしこれはSwift 3では機能しません:エラー:タイプ 'UIApplication'のオブジェクトにプロパティ 'shared'が見つかりません
Vaddadi Kartick

Swift 4およびXcode 9.1は、「エラー:<EXPR>:3:32:エラー:非関数型 'UIApplication'の値を呼び出せませんUIApplication.sharedApplication()。keyWindow?.recursiveDescription() "
Jason Harrison

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.