基本はコーディングガイドラインに沿う。
つまり、親クラス: コーディングガイドライン
- 必要に応じて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クラスをオーバーライド
- UIViewの
- 画像のファイル名には小文字のみを使う (iOSのファイルシステムはケースインセンシティブ)
- 画像を使う場合はRetina版も同時に用意する
- 画像が多くなる場合はバンドルにまとめる
- 画像をローカライズする場合はlprojごとに分ける (標準のローカライズ方法)
- なるべくopaqueはYES(不透明)にする
- ただし、backgroundColorを指定しない場合は、
drawRect:
でcontextを塗りつぶすこと。(contextの中身は不定)
- ただし、backgroundColorを指定しない場合は、
- CALayerのShadowを使う場合は必ず
shadowPath
を設定する
- UIテスト用のフレームワークは使用せずに手でデバッグする
- デバッグ用のアプリ・Controllerを作成する
- サイズが可変であるViewはリサイズのテストを行う
-
文字列
-
おおよそ想定される長さと極端に長い長さの文字でテストする
-
Retinaと非Retinaでテストする (実機 and シミュレータ)
-
和文(日本語)はソースに直接書く
- 欧文のみ
- 欧文と和文
- 和文
- スペースのみ
- 空文字列
- スペース・タブ・改行を含む文字列
- nil文字列
-
数値
- ゼロ
- マイナス
- プラス
- NAN
- -inf, inf
- 必要に応じてGLKitを使う