1. ホーム
  2. アイオス

[解決済み】layoutSubviewsはいつ呼び出されるのですか?

2022-04-16 10:21:41

質問

カスタムビューがあるのですが、そのビューに layoutSubview メッセージを表示します。

画面いっぱいに表示されるビューがあります。画面下にはカスタムサブビューがあり、ナビバーの高さを変更するとInterface Builderで正しくサイズ変更されます。 layoutSubviews は、ビューの作成時に呼び出されますが、それ以降は呼び出されません。私のサブビューは正しくレイアウトされています。通話中ステータスバーをオフにすると、サブビューの layoutSubviews は、メインビューがサイズ変更のアニメーションを行うにもかかわらず、まったく呼び出されません。

どのような状況で layoutSubviews は実際に呼び出されるのでしょうか?

私は autoresizesSubviews に設定します。 NO をカスタムビューに追加しました。そして、Interface Builderでは、上下のストラットと垂直の矢印を設定しました。


もうひとつは、ウィンドウをキーにすることです。

[window makeKeyAndVisible];

でないと、サブビューのサイズが自動的に変更されません。

解決方法は?

Interface Builderでは、シミュレーション画面要素(ステータスバーなど)がオンになっているビューでは、スプリングを変更することができないというのが、解決の糸口になりました。メインビューのスプリングがオフになっていたため、そのビューはサイズを変更できず、したがって通話中バーが表示されると全体がスクロールダウンされました。

シミュレーション機能をオフにしてから、ビューのサイズを変更し、スプリングを正しく設定すると、アニメーションが発生し、私のメソッドが呼び出されるようになりました。

このデバッグをする上でさらに問題になるのは、メニューから通話中のステータスを切り替えると、シミュレータがアプリを終了してしまうことです。アプリを終了させる=デバッガーを使わないということです。