web-dev-qa-db-ja.com

UIViewのlayoutSubviewsを強制する方法。

私の場合、自動サイズ変更マスクが機能しないため、縦向きと横向きの専用の手動で設定されたフレームを持つカスタムUIViewがあります。

このフレームを以下に設定します。

 - (void)viewWillAppear:(BOOL)animated

そして、期待通りに機能します。

私の問題は、UIViewにさらにサブビューがあり、サブビューにもポートレート/ランドスケープ専用の位置があることです。

これらのサブビューを次の場所に配置します。

- (void)layoutSubviews

ViewControllerをeg縦向きにして、別のviewControllerで横向きに回転してからこのviewControllerに戻ると、ビューのサイズが正しく変更されたことがわかりますが、ビューのサブビューは配置されますlayoutSubviewsの位置はまだ変更されていませんが、ビューが既に表示された後にアニメーション形式でサイズ変更されます。

ViewDidAppearで何もせず、すでに呼び出してみました

 - (void)layoutIfNeeded

と同様:

 - (void)setNeedsLayout

ViewWillAppearでは、何も変わらないようです。

私が間違っていることは何ですか?

ありがとう。

50
myell0w

今日も同様の問題がありました。最初に電話して解決しました

  • -setNeedsLayout:ビューがレイアウトを必要とするフラグを設定し、その後呼び出します
  • -layoutIfNeeded:すぐにフラグを確認し、-以前に手動で設定されたように-結果としてlayoutSubviewsが呼び出されます。

これが最良の方法であるかどうかはわかりませんが、動作します;)

92
blacky85

ViewDidLoadで初期フレームを設定してから、方向の変更のためにビューフレームを変更することをお勧めします

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

フレームの変更は回転アニメーションに同期されるため、layoutSubviewsに明示的なアニメーションは必要ありません(あるかどうかはわかりませんが、そのように聞こえます)。

画面外でも方向は引き続き回転する必要があるため、再び画面に戻るときにビューを正しく配置する必要があります。

WWDC 2010セッション123「Building Animation Driven UI」もご覧になることをお勧めします。

5
Chris Miles

Swift 3 @iOS 10.1

override func viewWillAppear(animated: Bool){

    super.viewWillAppear(animated)
    view.setNeedsLayout()
}

完璧に走る