9

すべてのサブビューを無効autoresizesSubviewsにして配置することを好みます。setFrameiOS 6 の時点で、状況は大きく変わったようです。のビューで setFrame を呼び出してviewDidLoadも効果はありません。からやってみましたviewWillAppear; 同じこと。

setFrame 呼び出しは で機能しますwillAnimateRotationToInterfaceOrientationが、iOS 5 のように最初は呼び出されません。

誰かが私のビューをどこからレイアウトすることが期待されているかを明確にしてもらえますか?

4

3 に答える 3

19

UIViewController からビューをレイアウトしたいと思います。viewDidLayoutSubviewsでレイアウト タスクを実行してみましたか:

- (void)viewDidLayoutSubviews

Appleのドキュメントによると:

ビューがサブビューをレイアウトした後、View Controller はこのメソッドをオーバーライドして変更を加えることができます。

ビュー自体はサブビューのレイアウトを行わないため (autosize、autolayout、または layoutSubViews を使用しません:)、このメソッドでレイアウト タスクを実行できます。

それにもかかわらず、エレガントな方法は、カスタムの親 UIView を使用し、そこですべてのレイアウトを実行して、UIView をオーバーライドlayoutSubViews:することです (ビューを動的に追加/削除しない限り)。「ビューコントローラーがビューレイアウトプロセスに参加する方法」に関するAppleのドキュメントからの引用:

理想的には、ビュー コントローラーがプロセスにまったく参加する必要がなく、ビュー自体が再配置に必要なすべての作業を実行します。ただし、View Controller がビューを動的に追加および削除する場合、Interface Builder で静的レイアウトを使用できない場合があります。この場合、ビュー コントローラーはプロセスを制御するのに適した場所です。多くの場合、ビュー自体にはシーン内の他のビューの限られた画像しかないためです。

于 2012-09-28T18:28:24.317 に答える
3

Interface Builder で Autolayout オプションのチェックを外すと、setFrameで使用できます。viewDidLoad自動レイアウトを使用する必要がある場合は、 でレイアウト タスクを実行する必要がありますviewDidLayoutSubviews:

Interface Builder で Autolayout のチェックを外します

于 2014-02-02T11:03:29.987 に答える
0

「ビューに自分自身をレイアウトするように依頼することは、私には意味がありません。ビューには、どこに行くべきかを言う権限がありません。それがコントローラーの役割ですよね?」. 答えはしばしば否定的だと思います。通常、独自のサブビューをレイアウトする役割を果たすのは、親ビュー (ビュー コントローラーではない) です。これは、autoresizingMask または autolayout (iOS 6 のみ) を利用して行います。-layoutSubviewsまたは、親ビューのメソッドをオーバーライドすることにより、プログラムでレイアウトを作成できます。

確かに、Imre が述べたように、コントローラーは をオーバーライドすることでレイアウト プロセスにも参加できます- (void)viewDidLayoutSubviews。シンプルにするためにビュー コントローラーの最上位ビューをサブクラス化したくない場合は、このアプローチをよく使用します。

最後に、この投稿が非常に役立つことがわかりました。いくつかの小さなエラーがあっても、投稿はビュー レイアウト プロセスの全体像を提供します。

于 2013-02-02T08:58:48.370 に答える