UIVIew
概要
UIView は、アプリケーションの UI を構成する基盤となるブロックであり、矩形領域内にコンテンツを描画し、そのコンテンツとのインタラクションをハンドリングする。ラベルや画像、ボタン等の要素を表示する場合は、大抵 UIView のサブクラスとして定義されている。
責務
アニメーションの描画
UIKit や Core Graphics を利用してコンテンツを描画する
レイアウトと SubView の管理
0 以上の SubView を保持し、それらのサイズと位置を調整する
Auto Layout を介してルールを定義できる
イベントハンドリング
UIResponder のサブクラスで、タッチ等の様々なイベントに応答する
View hierarchy
UIView は複数の SubView と最大 1 つの SuperView を持つことができ、ネスト構造を構成できる。デフォルトだと、SuperView の描画領域から SubView がはみ出しても、SubView のコンテンツのクリッピングは行われない。clipsToBounds を true に設定すると、このクリップが行われるようになる。
形状
UIView の形状は主に下記で定義される。
frame SuperView の座標系における View の位置とサイズ
center SuperView の座標系における View の原点
bounds View 自身の座標系における View の位置とサイズ
transform View に適用されるアニメーションを定義するアフィン変換行列
center および frame で、SubView 上の View の位置とサイズを変更できる。位置を変更するだけだったら center だけ変更するのが良い。なぜなら、center は拡大縮小や回転などのアニメーションの描画中なども常に valid だが、frame はアフィン変換が指定されている場合等には無視されてしまうため。
frame と bounds の違いは、アニメーション中に valid であるかどうかで、前者はアニメーション中は変更できず、後者はできる。
下記は、各々についてのメモ。
frame
SuperView の座標システムにおける View の位置とサイズを定義する CGRect
変更すると、
bounds のサイズが変更後の frame のサイズに変更される
center の座標が変更後の frame の座標に変更される
変更時には、draw(_:) メソッドが呼ばれずに自動で再描画される
再描画時に呼び出したい場合は、UIView.ContentMode.redraw の contentMode を変更する
変更をアニメーション可能
transform が Identity ではない (= 変換なしではない) 場合は、frame の値は未定義となり、無視されるべきで、変更もすべきでない
このような場合にサイズや位置の調整がしたい場合は、center と bounds を利用する
https://developer.apple.com/documentation/uikit/uiview/1622621-frame
bounds
自身の座標システムにおける位置とサイズを定義する CGRect
デフォルトでは原点が (0, 0) で、サイズは frame と一致している
変更すると、frame のサイズが変更後の bounds のサイズに変更される
変更時には、draw(_:) メソッドが呼ばれずに自動で再描画される
再描画時に呼び出したい場合は、UIView.ContentMode.redraw の contentMode を変更する
変更をアニメーション可能
center
SuperView の座標システムにおける frame の原点を保持する CGPoint
変更すると、frame の座標が変更後の center の座標に変更される
変更をアニメーション可能
https://developer.apple.com/documentation/uikit/uiview/1622627-center
transform
View に適用される変化を定義する CGAffineTransform
SuperView の座標システムにおける frame 領域を、拡大縮小したり回転したりできる
位置の変更には center を利用する
デフォルト値は CGAffineTransformIdentity (= 恒等写像, 変化なし)
これ以外の値の場合、frame プロパティは未定義となり、無視される
変化は、View のアンカーポイントに対して相対的に起こる
アンカーポイントは、デフォルトだと frame の中心点
変更したい場合は、View が依存する CALayer オブジェクトの anchorPoint プロパティを変更する
変更をアニメーション可能
https://developer.apple.com/documentation/uikit/uiview/1622459-transform
参考
View Geometry and Coordinate Systems
Initialization
init(frame:) 実装が推奨される
init(coder:)
view を storyboard や nib からロードするときに実装する
引数の coder は unarchiver
詳しくは以下を後で読む
https://egg-is-world.com/2018/07/05/custom-view-initialize/
https://qiita.com/stastaahaha/items/e45e7559255fb7666fd8
https://developer.apple.com/documentation/uikit/uiview