10

プロジェクトを iOS 6 にアップグレードした後、自動レイアウトは viewDidAppear でのみ有効であり、ほとんどのコードはビューのフレームが viewDidLoad で使用できることを期待していることに気付きました。この制限により、本当に便利な自動レイアウト機能がほとんど役に立たなくなります。自動レイアウトの使用に役立つ提案はありますか?

たとえば、開発者は、特定のサブビューを配置するために自動レイアウトが選択した場所に基づいて、サブビューに関する情報を調整する必要がある場合があります。サブビューの最終的な場所は、ユーザーがサブビューを確認するまで、開発者は確認できません。ユーザーはこれらの情報の調整を見るべきではありませんが、最終的な結果を一度に表示する必要があります。

より具体的には、自動レイアウトがそのビューを配置する場所に基づいて、ビュー内の画像を変更したい場合はどうすればよいですか? その場所を照会して、ユーザーがそれを確認せずに画像を変更することはできません。

4

2 に答える 2

6

原則として、ビューのフレーム/境界はで信頼されるべきではありませんviewDidLoad

このviewDidLoadメソッドは、プログラムで、または.nib/.xibファイルを介してビューが作成された後にのみ呼び出されます。この時点では、ビューはセットアップされておらず、メモリにロードされているだけです。

ビューのレイアウトは、ビューの表示の準備ができたら、またはこれらのメソッドが呼び出されるときに、常に行う必要があります。viewWillAppearviewDidAppear

テストとして、単にNSLog(@"frame: %@", NSStringFromCGRect(self.view.frame));yourviewDidLoadviewWillAppearmethodsの両方を使用すると、後者のメソッドのみが、ビューにラップされている他の要素(UINavigationBarandなどUITabBar)に関連する実際のビューサイズを返すことがわかります。

于 2012-11-01T14:48:25.510 に答える
0

コメントでview.layoutIfNeeded()@charshep が語ったように、viewWillAppear を呼び出すとうまくいきます。

彼の元のコメントの引用

テーブルビューを押したときに正しいスクロール位置に表示されるのに問題がありました[...] viewWillAppearの後までレイアウトが発生しなかったためです。これは、正しいサイズが設定される前にスクロール計算が行われていたため、結果がずれていたことを意味していました。私にとってうまくいったのは、layoutIfNeededを呼び出してから、viewWillAppearでスクロール位置を設定するコードを呼び出すことでした。

于 2016-02-09T10:37:01.380 に答える