Skip to content

Instantly share code, notes, and snippets.

@novi novi/gist:1486262
Created Dec 16, 2011

Embed
What would you like to do?
オレオレUIViewコーディングガイドライン

UIViewコーディングガイドライン

基本はコーディングガイドラインに沿う。

つまり、親クラス: コーディングガイドライン

クラス構造と階層モデル

  • 必要に応じてViewの内部で保有関係を階層化する
  • 一番親のView(Controllerと直接やりとりするView)でのControllerへのメッセージ送信にはデリゲートモデルを使う
  • 階層化されたView内同士のやりとり、子Viewから親Viewへのメッセージ送信には、子Viewから親Viewを参照して直接メッセージを送信する
  • またはView同士のイベント伝達、Controllerへのイベント伝達はResponderChainを使う
    • ↑この辺はケースバイケース
  • 子Viewが親Viewを参照するときは、Viewの循環参照に注意する
  • 子Viewは必ずしも親Viewの領域内の必要は無い。ただしイベント取得は不定
  • イベントの必要ないViewはイベントを受け付けないようにする (userInteractionEnabled=NO)
  • イベントの取得はGestureRecognizerを使う
  • イベントの取得はUIContolのサブクラスを使う
    • さらに細かい制御が必要ならUIViewのイベント処理をオーバーライド
  • UIButtonはサブクラス化可能

レイアウト

  • -layoutSubviews でレイアウトする
    • 親のlayoutSubviewsを先に呼ぶ
    • 通常はframeの変化や回転などで呼ばれる(勝手に決められるのでいつ何回呼ばれても良いようにする)
    • ScrollViewなどではスクロールするごとに呼ばれる
    • ScrollViewのdidScroll...:デリゲートなどではレイアウトしない
  • 必要に応じて子Viewのキューイング・再利用する (UITableViewのパターン)
  • CGRectIntegralの に注意
  • 境界線がボケるのを防ぐにはframe=boundsを整数値に丸める
  • 矩形や角丸のパスがボケるのを防ぐには0.5Insetする
  • CGGeometry.hやUIGeometry.h(UIEdgeInsets系)にあるユーティリティメソッドを使う。

描画・リソースの使用

  • グラデーションにはCAGradientLayerをうまく使う
    • UIViewの+layerClassでUIViewで使うLayerクラスをオーバーライド
  • 画像のファイル名には小文字のみを使う (iOSのファイルシステムはケースインセンシティブ)
  • 画像を使う場合はRetina版も同時に用意する
  • 画像が多くなる場合はバンドルにまとめる
  • 画像をローカライズする場合はlprojごとに分ける (標準のローカライズ方法)
  • なるべくopaqueはYES(不透明)にする
    • ただし、backgroundColorを指定しない場合は、drawRect: でcontextを塗りつぶすこと。(contextの中身は不定)
  • CALayerのShadowを使う場合は必ずshadowPathを設定する

テスト

  • UIテスト用のフレームワークは使用せずに手でデバッグする
  • デバッグ用のアプリ・Controllerを作成する
  • サイズが可変であるViewはリサイズのテストを行う

テストデータ

  • 文字列

  • おおよそ想定される長さと極端に長い長さの文字でテストする

  • Retinaと非Retinaでテストする (実機 and シミュレータ)

  • 和文(日本語)はソースに直接書く

    • 欧文のみ
    • 欧文と和文
    • 和文
    • スペースのみ
    • 空文字列
    • スペース・タブ・改行を含む文字列
    • nil文字列
  • 数値

    • ゼロ
    • マイナス
    • プラス
    • NAN
    • -inf, inf

OpenGL

  • 必要に応じてGLKitを使う
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.