DCIntrospect でView, UIコンポーネントのデバッグをする

※ この記事はiOS Advent Calendar 2011 とは関係ありませんが、がんばりました


domesticcatsoftware/DCIntrospect - GitHub
https://github.com/domesticcatsoftware/DCIntrospect

DCIntrospect はPatrick Richards(@patr) によって開発されている、オープンソース(MIT ライセンス)のiOS/UIKit 向けビジュアルデバッグツール。モジュールを自分のアプリケーションに埋め込んで開発中のアプリケーションのView デバッグに利用できる。

ちょうどiOS シミュレータのAccessibility Inspectorの機能を拡張したような印象。

デモを動作させる

    git clone https://github.com/domesticcatsoftware/DCIntrospect.git
    open DCIntrospectDemo/

自分のプロジェクトで使う

雛形プロジェクトを用意しました

    git clone https://github.com/laiso/iOSSamples.git
    cd iOSSamples/DCIntrospectSample

CocoaPods ユーザーはpodspec を書いたので以下でプロジェクトに取り込めます

# Podfile
platform :ios
dependency 'DCIntrospect'
    pod repo add laiso https://github.com/laiso/Podspecs.git
    # xcodeproj は閉じておく
    pod install *.xcodeproj
    open *.xcworkspace

それ以外の人は…… まぁ依存の少ないモジュールなのでソースを全部手動でD&DでインポートしてもOKです。その場合はARC はオフにしましょう*1

使ってみよう

まずiOS Simulator 向けにビルドして実行。

デモを起動するとこんな感じの初期画面になります。
そしておもむろにスペースキーを打鍵。

上になんか黒いバーがでてきた。
これでIntrospect モードに切り替わりました。
画面のUIコンポーネントを適当にクリックします。

view のframe の値っぽいものや画面端までの距離などが表示されました。
他に一体どんなことができるのか?
'?' キーを押してみましょう。

ヘルプが読み込まれました。

  • アウトライン、非Opaque のハイライト
  • View のプロパティや包括しているView の情報をログへ出力
  • ブレーク→デバッガ実行
  • View の上下左右の移動
  • 透明度の調整
  • View の再描写指示

など、いろんなコマンドがあるのでひととうり試してみてください。

またキーバインディングは DCIntrospectSettings.h を編集することで変更ができます。

実機ではどうするの?

iPhone 実機には物理スペースキーとか存在しないのでどうすれば、というもののちゃんとそこも用意されています。

デモで記述されている以下のコードに注目してください。

    // create a custom tap gesture recognizer so introspection can be invoked from a device
    // this one is a three finger double tap
    UITapGestureRecognizer *defaultGestureRecognizer = [[UITapGestureRecognizer alloc] init];
    defaultGestureRecognizer.cancelsTouchesInView = NO;
    defaultGestureRecognizer.delaysTouchesBegan = NO;
    defaultGestureRecognizer.delaysTouchesEnded = NO;
    defaultGestureRecognizer.numberOfTapsRequired = 3;
    defaultGestureRecognizer.numberOfTouchesRequired = 2;
    [DCIntrospect sharedIntrospector].invokeGestureRecognizer = defaultGestureRecognizer;

コメントのとうり、Introspect 起動専用のタップジェスチャを登録しています。
この場合だと、2本指でトリプルタップするとシミュレータでスペースキーを押した時のような反応になります。

ただ確認した所では、UIコンポーネントをタップしてframe の数値を表示までは確認できましたが、ハイライトやプロパティのダンプやView の移動などその他の便利な機能が試すことができませんでした。
(ひとつひとつにジェスチャのような呼び出しコマンドの登録が必要?)

さらに:Apple サンプルコードのプロジェクトに組み込んでみる

お馴染UICatalog に組み込んでみます。

# Podfile
platform :ios
dependency 'DCIntrospect'
    curl -LO 'http://developer.apple.com/library/ios/samplecode/UICatalog/UICatalog.zip' && unzip UICatalog.zip && cd UICatalog  && open UICatalog.xcodeproj
    # add Podfile
    pod install *.xcodeproj
    open *.xcworkspace

以下のようにAppDelegate.m を書き換え使ってみます。

※ DCIntrospect を組み込んでビルドしてみたところ、Xcode 3からのプロジェクトの互換性なのかビルド環境変数がうまく、扱われるヘッダファイルを見付けられませんでした。
その場かぎりの対策として以下をHeader Search Path に登録しました。

    $(HOME)/Library/Developer/Xcode/DerivedData/UICatalog-dtdbkesytlvuyfdswfbhxumyvcav/Build/Products/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods

でビルド

無事、UICatalog にDCIntrospect を仕込みデバッグすることができました。

まとめ

DCIntrospect が便利