284

layoutSubviewアニメーション中にメッセージが表示されないカスタム ビューがあります。

画面いっぱいのビューがあります。画面の下部にカスタム サブビューがあり、ナビゲーション バーの高さを変更すると、Interface Builder で正しくサイズ変更されます。layoutSubviewsビューが作成されたときに呼び出されますが、二度と呼び出されません。私のサブビューは正しくレイアウトされています。通話中のステータスバーをオフにするlayoutSubviewsと、メインビューがサイズ変更をアニメーション化しても、サブビューはまったく呼び出されません。

layoutSubviews実際にどのような状況で呼び出されますか?

カスタムビューに設定しましたautoresizesSubviewsNOInterface Builder では、上部と下部のストラットと垂直方向の矢印が設定されています。


パズルのもう 1 つの部分は、ウィンドウをキーにする必要があることです。

[window makeKeyAndVisible];

それ以外の場合、サブビューは自動的にサイズ変更されません。

4

8 に答える 8

518

同様の質問がありましたが、答え(またはネットで見つけたもの)に満足できなかったので、実際に試してみたところ、得られたものは次のとおりです。

  • init呼び出されませんlayoutSubviews(当然)
  • addSubview:layoutSubviews追加されるビュー、追加されるビュー (ターゲット ビュー)、およびターゲットのすべてのサブビューで呼び出されます。
  • フレームのサイズ パラメータが異なる場合にのみ、フレーム セットを持つビューをsetFrame インテリジェントに呼び出します。layoutSubviews
  • UIScrollView をスクロールするlayoutSubviewsと、scrollView とそのスーパービューで呼び出されます
  • デバイスを回転させると layoutSubview、親ビュー (応答する viewControllers プライマリ ビュー) のみが呼び出されます。
  • ビューのサイズを変更すると、そのスーパービューが呼び出さlayoutSubviewsれます (重要: 固有のコンテンツ サイズを持つビューは、サイズを決定するコンテンツが変更された場合にサイズが変更されます。たとえば、UILabel のテキストを更新すると、固有のコンテンツ サイズが更新されるため、layoutSubviewsそのスーパービューを呼び出します)

私の結果 - http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/

于 2011-03-16T18:42:58.673 に答える
20

https://developer.apple.com/library/prerelease/tvos/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html#//apple_ref/doc/uid/TP40009503-CH5-SW1

ビューで次のいずれかのイベントが発生すると、レイアウトの変更が発生する可能性があります。

a. ビューの境界四角形のサイズが変更されます。
b. 通常、ルート ビューの境界の四角形の変更をトリガーする、インターフェイスの向きの変更が発生します。
c. ビューのレイヤーに関連付けられた Core Animation サブレイヤーのセットが変更され、レイアウトが必要になります。
d. アプリケーションは、ビューの setNeedsLayout または layoutIfNeeded メソッドを呼び出すことにより、強制的にレイアウトを発生させます。
e. アプリケーション setNeedsLayout は、ビューの基礎となるレイヤー オブジェクトのメソッドを呼び出してレイアウトを強制します。

于 2015-09-10T06:14:36.963 に答える
13

BadPirate の回答のいくつかの点は、部分的にしか当てはまりません。

  1. addSubViewポイント用

    addSubview追加されるビュー、追加されるビュー (ターゲット ビュー)、およびターゲットのすべてのサブビューで、layoutSubviews が呼び出されます。

    これは、ビュー (ターゲット ビュー) の自動サイズ変更マスクに依存します。自動サイズ変更マスクがオンになっている場合、 layoutSubview がそれぞれで呼び出されますaddSubview。自動サイズ変更マスクがない場合、ビュー (ターゲット ビュー) のフレーム サイズが変更された場合にのみ、layoutSubview が呼び出されます。

    例: UIView をプログラムで作成した場合 (デフォルトでは自動サイズ変更マスクはありません)、LayoutSubview は UIView フレームがすべてではなく変更された場合にのみ呼び出されますaddSubview

    この手法により、アプリケーションのパフォーマンスも向上します。

  2. デバイスの回転ポイント

    デバイスの回転は、親ビュー (応答する viewController のプライマリ ビュー) でのみ layoutSubview を呼び出します。

    これは、VC が VC 階層 (root at ) にある場合にのみ当てはまりますwindow.rootViewController。これは最も一般的なケースです。iOS 5 では、VC を作成しても、それが別の VC に追加されていない場合、この VC はデバイスの回転時に認識されません。したがって、そのビューは、layoutSubviews を呼び出しても認識されません。

于 2012-10-29T11:59:14.370 に答える
9

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

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

これをデバッグする際の追加の問題は、通話中のステータスがメニューから切り替えられると、シミュレーターがアプリを終了することです。アプリを終了する = デバッガーなし。

于 2009-04-09T14:41:40.763 に答える
9

[self.view setNeedsLayout]; viewController で呼び出すと、viewDidLayoutSubviews が呼び出されます

于 2014-02-14T20:39:58.470 に答える
6

layoutIfNeededを見たことがありますか?

ドキュメントスニペットは以下のとおりです。アニメーション中にこのメソッドを明示的に呼び出すと、アニメーションは機能しますか?

layoutIfNeeded必要に応じて、サブビューをレイアウトします。

- (void)layoutIfNeeded

考察この方法を使用して、描画する前にサブビューのレイアウトを強制します。

可用性iPhoneOS2.0以降で利用できます。

于 2009-04-08T04:12:24.483 に答える
2

OpenGL アプリを SDK 3 から 4 に移行すると、layoutSubviews が呼び出されなくなりました。多くの試行錯誤の後、最終的に MainWindow.xib を開き、Window オブジェクトを選択し、インスペクターで [ウィンドウ属性] タブ (左端) を選択し、[起動時に表示] をオンにしました。SDK 3 では、layoutSubViews 呼び出しが発生していたようですが、4 では発生していません。

6時間のフラストレーションが解消されました。

于 2010-06-24T07:13:42.850 に答える