58

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

このフレームを次のように設定しました。

 - (void)viewWillAppear:(BOOL)animated

そして、それは期待どおりに機能します。

私の問題は、私の UIView に、縦向き/横向き専用の位置を持つサブビューがさらにあることです。

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

- (void)layoutSubviews

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

私はviewDidAppearで何もしません、そして私はすでに電話を試みました

 - (void)layoutIfNeeded

としても:

 - (void)setNeedsLayout

ですが、viewWillAppear何も変わっていないようです。

私が間違っていることはありますか?

4

4 に答える 4

107

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

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

これが最善の方法かどうかはわかりませんが、うまくいきます;)

于 2013-02-28T17:02:03.137 に答える
5

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

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

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

画面外でも向きを回転させる必要があるため、画面に戻ったときにビューが正しく配置されるはずです。

また、WWDC2010セッション123「アニメーション駆動型UIの構築」をご覧になることをお勧めします。

于 2011-09-27T23:39:34.753 に答える
4

Swift 3 @iOS 10.1で

override func viewWillAppear(animated: Bool){

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

完璧に動作します

于 2016-11-23T17:39:14.140 に答える
-2

私にとってうまくいったのは[self.view setNeedsDisplay]. これにより、ビュー全体で再描画が呼び出されます。特定のビューを呼び出しsetNeedsDisplayて、選択したビューを再描画することもできます。私の場合はこれを実行しましたが、完全に機能しました。

于 2015-04-28T13:04:59.267 に答える