Apple UIView
はドキュメントでサブクラス化する方法をかなり明確に定義しました。
以下のリストをチェックし、特に見てみましょうinitWithFrame:
とlayoutSubviews
。前者はフレームを設定するためのものでUIView
、後者はフレームとそのサブビューのレイアウトを設定するためのものです。
またinitWithFrame:
、UIView
プログラムでインスタンス化している場合にのみ呼び出されることを忘れないでください。nibファイル(またはストーリーボード)からロードする場合は、initWithCoder:
が使用されます。またinitWithCoder:
、フレームはまだ計算されていないため、Interface Builderで設定したフレームを変更することはできません。この回答で提案されているように、フレームをセットアップするためにinitWithFrame:
から呼び出すことを考えるかもしれませんinitWithCoder:
。
最後に、UIView
nib(またはストーリーボード)からをロードすると、awakeFromNib
カスタムフレームとレイアウトの初期化を実行する機会も得られます。awakeFromNib
これは、呼び出されたときに、階層内のすべてのビューがアーカイブ解除されて初期化されていることが保証されているためです。
のドキュメントからNSNibAwaking
(現在はのドキュメントに置き換えられていますawakeFromNib
):
他のオブジェクトへのメッセージは、awakeFromNib内から安全に送信できます。その時点で、すべてのオブジェクトがアーカイブ解除され、初期化されていることが保証されます(もちろん、必ずしも起こされるわけではありません)。
また、autolayoutではビューのフレームを明示的に設定しないでください。代わりに、フレームがレイアウトエンジンによって自動的に計算されるように、一連の十分な制約を指定することになっています。
ドキュメントから直接:
オーバーライドするメソッド
初期化
initWithFrame:
このメソッドを実装することをお勧めします。このメソッドに加えて、またはこのメソッドの代わりに、カスタム初期化メソッドを実装することもできます。
initWithCoder:
Interface Builder nibファイルからビューをロードし、ビューにカスタム初期化が必要な場合は、このメソッドを実装します。
layerClass
このメソッドを実装するのは、ビューでバッキングストアに別のコアアニメーションレイヤーを使用する場合のみです。たとえば、描画にOpenGL ESを使用している場合、このメソッドをオーバーライドしてCAEAGLLayerクラスを返す必要があります。
描画と印刷
制約
requiresConstraintBasedLayout
ビュークラスが適切に機能するために制約が必要な場合は、このクラスメソッドを実装します。
updateConstraints
ビューでサブビュー間にカスタム制約を作成する必要がある場合は、このメソッドを実装してください。
alignmentRectForFrame:
、frameForAlignmentRect:
これらのメソッドを実装して、ビューが他のビューに配置される方法をオーバーライドします。
レイアウト
sizeThatFits:
ビューのデフォルトサイズを、サイズ変更操作中の通常のサイズとは異なるものにする場合は、このメソッドを実装します。たとえば、このメソッドを使用して、ビューがサブビューを正しく表示できないポイントまで縮小しないようにすることができます。
layoutSubviews
制約または自動サイズ変更動作が提供するよりもサブビューのレイアウトをより正確に制御する必要がある場合は、このメソッドを実装します。
didAddSubview:
、willRemoveSubview:
サブビューの追加と削除を追跡するために、必要に応じてこれらのメソッドを実装します。
willMoveToSuperview:
、didMoveToSuperview
必要に応じてこれらのメソッドを実装して、ビュー階層内の現在のビューの動きを追跡します。
willMoveToWindow:
、didMoveToWindow
必要に応じてこれらのメソッドを実装して、ビューの別のウィンドウへの移動を追跡します。
イベント処理:
touchesBegan:withEvent:
、touchesMoved:withEvent:
、touchesEnded:withEvent:
、touchesCancelled:withEvent:
あなたが直接タッチイベントを処理する必要がある場合は、これらのメソッドを実装します。(ジェスチャーベースの入力には、ジェスチャー認識機能を使用してください。)
gestureRecognizerShouldBegin:
ビューがタッチイベントを直接処理し、アタッチされたジェスチャー認識機能が追加のアクションをトリガーしないようにする場合は、このメソッドを実装します。