UIVIew
概要
UIView は、アプリケーションの UI を構成する基盤となるブロックであり、矩形領域内にコンテンツを描画し、そのコンテンツとのインタラクションをハンドリングする。ラベルや画像、ボタン等の要素を表示する場合は、大抵 UIView のサブクラスとして定義されている。 責務
アニメーションの描画
レイアウトと SubView の管理
0 以上の SubView を保持し、それらのサイズと位置を調整する
イベントハンドリング
UIView は複数の SubView と最大 1 つの SuperView を持つことができ、ネスト構造を構成できる。デフォルトだと、SuperView の描画領域から SubView がはみ出しても、SubView のコンテンツのクリッピングは行われない。clipsToBounds を true に設定すると、このクリップが行われるようになる。 形状
frame SuperView の座標系における View の位置とサイズ center SuperView の座標系における View の原点 bounds View 自身の座標系における View の位置とサイズ center および frame で、SubView 上の View の位置とサイズを変更できる。位置を変更するだけだったら center だけ変更するのが良い。なぜなら、center は拡大縮小や回転などのアニメーションの描画中なども常に valid だが、frame はアフィン変換が指定されている場合等には無視されてしまうため。 frame と bounds の違いは、アニメーション中に valid であるかどうかで、前者はアニメーション中は変更できず、後者はできる。 下記は、各々についてのメモ。
SuperView の座標システムにおける View の位置とサイズを定義する CGRect
変更すると、
再描画時に呼び出したい場合は、UIView.ContentMode.redraw の contentMode を変更する
変更をアニメーション可能
transform が Identity ではない (= 変換なしではない) 場合は、frame の値は未定義となり、無視されるべきで、変更もすべきでない 自身の座標システムにおける位置とサイズを定義する CGRect
デフォルトでは原点が (0, 0) で、サイズは frame と一致している 再描画時に呼び出したい場合は、UIView.ContentMode.redraw の contentMode を変更する
変更をアニメーション可能
SuperView の座標システムにおける frame の原点を保持する CGPoint 変更をアニメーション可能
SuperView の座標システムにおける frame 領域を、拡大縮小したり回転したりできる デフォルト値は CGAffineTransformIdentity (= 恒等写像, 変化なし)
これ以外の値の場合、frame プロパティは未定義となり、無視される 変化は、View のアンカーポイントに対して相対的に起こる
アンカーポイントは、デフォルトだと frame の中心点 変更をアニメーション可能
参考
Initialization
init(frame:) 実装が推奨される
init(coder:)
引数の coder は unarchiver
詳しくは以下を後で読む