私の場合、自動サイズ変更マスクが機能しないため、縦向きと横向きの専用の手動で設定されたフレームを持つカスタムUIViewがあります。
このフレームを以下に設定します。
- (void)viewWillAppear:(BOOL)animated
そして、期待通りに機能します。
私の問題は、UIViewにさらにサブビューがあり、サブビューにもポートレート/ランドスケープ専用の位置があることです。
これらのサブビューを次の場所に配置します。
- (void)layoutSubviews
ViewControllerをeg縦向きにして、別のviewControllerで横向きに回転してからこのviewControllerに戻ると、ビューのサイズが正しく変更されたことがわかりますが、ビューのサブビューは配置されますlayoutSubviewsの位置はまだ変更されていませんが、ビューが既に表示された後にアニメーション形式でサイズ変更されます。
ViewDidAppearで何もせず、すでに呼び出してみました
- (void)layoutIfNeeded
と同様:
- (void)setNeedsLayout
ViewWillAppearでは、何も変わらないようです。
私が間違っていることは何ですか?
ありがとう。
今日も同様の問題がありました。最初に電話して解決しました
-setNeedsLayout
:ビューがレイアウトを必要とするフラグを設定し、その後呼び出します-layoutIfNeeded
:すぐにフラグを確認し、-以前に手動で設定されたように-結果としてlayoutSubviewsが呼び出されます。これが最良の方法であるかどうかはわかりませんが、動作します;)
ViewDidLoadで初期フレームを設定してから、方向の変更のためにビューフレームを変更することをお勧めします
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
フレームの変更は回転アニメーションに同期されるため、layoutSubviewsに明示的なアニメーションは必要ありません(あるかどうかはわかりませんが、そのように聞こえます)。
画面外でも方向は引き続き回転する必要があるため、再び画面に戻るときにビューを正しく配置する必要があります。
WWDC 2010セッション123「Building Animation Driven UI」もご覧になることをお勧めします。
Swift 3 @iOS 10.1
override func viewWillAppear(animated: Bool){
super.viewWillAppear(animated)
view.setNeedsLayout()
}
完璧に走る