web-dev-qa-db-ja.com

サブクラスでカスタムUIViewのフレームサイズを取得する場所

ストーリーボードを使用してカスタムUIViewを追加すると、UIViewの正しいフレームサイズはいつ計算されますか? IView'sinit(frame: CGRect)またはinit(coder aDecoder: NSCoder)またはawakeFromNib()で正しいフレームサイズを取得できません。 override func layoutSubviews()で正しいサイズを取得しましたが、今回はビューがビューコントローラーのビューに追加されていません。

編集:
カスタムCAGradientLayerUIViewレイヤー(ビューと同じサイズ)を追加するため、UIViewサブクラスでこれを実行したいと思います。 UIViewControllers viewDidLayoutSubviewsメソッドでビューを設定するよりも良い方法があるはずです。

カスタムビューの幅を調整する2つの垂直方向の制約(スーパービューへの末尾と先頭のスペース)があります。ただし、前述の方法では、画面の幅ではなく、幅は600です。

15
osrl
_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から直接フレームを抽出する方法については、以下の私のコメントも参照してください。

25
foundry

viewDidLayoutSubviews()は複数回呼び出されるため、viewDidAppear()デリゲートを使用することをお勧めします。

viewDidLoad()は、フレームが設定される前に呼び出されます。

viewDidLayoutSubviews()はフレームのサイズ設定中に呼び出され、異なるフレームサイズ(通常はフレームが計算される前のframeZero)で複数回呼び出されます。

viewDidAppear()すべてのフレームが設定されます。

1
bauerMusic

UIViewへのIBOutletが必要であり、viewDidLayoutSubviews()メソッドで、yourViewOutlet.frame.sizeでサイズを取得します。

0
ad121