ストーリーボードを使用してカスタムUIViewを追加すると、UIViewの正しいフレームサイズはいつ計算されますか? IView'sinit(frame: CGRect)
またはinit(coder aDecoder: NSCoder)
またはawakeFromNib()
で正しいフレームサイズを取得できません。 override func layoutSubviews()
で正しいサイズを取得しましたが、今回はビューがビューコントローラーのビューに追加されていません。
編集:
カスタムCAGradientLayer
にUIView
レイヤー(ビューと同じサイズ)を追加するため、UIViewサブクラスでこれを実行したいと思います。 UIViewController
s viewDidLayoutSubviews
メソッドでビューを設定するよりも良い方法があるはずです。
カスタムビューの幅を調整する2つの垂直方向の制約(スーパービューへの末尾と先頭のスペース)があります。ただし、前述の方法では、画面の幅ではなく、幅は600です。
_func viewWillAppear(_ animated: Bool)
_
これは、ビュー階層が配置され、ジオメトリが設定された後、viewControllerで呼び出されます。
これは通常、ジオメトリに依存するviewControllerコードを配置するのに最適な場所であり、遷移アニメーションが実行される直前に呼び出されます。
その後、遷移アニメーションが完了した後に呼び出されるviewDidAppear
への呼び出しが続きます。
更新
これを(viewControllerではなく)カスタムビューで直接設定する場合、オーバーライドする適切なUIView関数はlayoutSubviews
です。オーバーライドでは必ずsuper.layoutSubviews()
を呼び出してください。
_override func layoutSubviews() {
super.layoutSubviews()
//self.frame will be correct here
}
_
これは、viewControllerのviewWillAppear
の後およびviewDidAppear
の前に呼び出されます。
更新2:collectionViewセルコレクションビューセルは、collectionviewのレイアウトからフレームデータを取得します。セルがそのジオメトリを知る必要がある場合は、applyLayoutAttributes
をオーバーライドできます。
_func applyLayoutAttributes(_ layoutAttributes: UICollectionViewLayoutAttributes!)
_
デフォルトのlayoutAttributesの1つは、frameプロパティです。 collectionView.layoutから直接フレームを抽出する方法については、以下の私のコメントも参照してください。
viewDidLayoutSubviews()
は複数回呼び出されるため、viewDidAppear()
デリゲートを使用することをお勧めします。
viewDidLoad()
は、フレームが設定される前に呼び出されます。
viewDidLayoutSubviews()
はフレームのサイズ設定中に呼び出され、異なるフレームサイズ(通常はフレームが計算される前のframeZero)で複数回呼び出されます。
viewDidAppear()
すべてのフレームが設定されます。
UIViewへのIBOutletが必要であり、viewDidLayoutSubviews()
メソッドで、yourViewOutlet.frame.size
でサイズを取得します。