XCode5とiOS7で問題なく動作していたプロジェクトがありますが、最近XCode 6をダウンロードしたときに、自動レイアウトの奇妙な動作に気づきました。
UIImageViewと2つのUILabelだけを持つビューのストーリーボードがあります。このビューは、UiPageViewControllerを使用してロードされます。 UIImageViewは、ビューの水平方向と垂直方向の中央に配置され、画像ビューからの2つのラベルの距離を指定する制約があります。ストーリーボードと自動レイアウトの値が競合する場合があります(たとえば、ストーリーボードでは、1つのラベルが画像ビューの20ピクセル上にありますが、自動レイアウトでは40ピクセル上にある必要があります)、以前は自動レイアウトの値はビューがロードされる前に正常に適用されました。したがって、ビューが初めて表示されるときは、すべてが適切な場所にあります。
IOS 8/XCode 6では、ビューが読み込まれ、最終的な自動レイアウト位置にジャンプすることがわかります。このジャンプは、シミュレーターと実際のデバイスの両方でエンドユーザーに目立ち、非常に煩わしいものです。以前の動作に戻る方法はありますか?私の知る限り、この問題を引き起こすコードは変更されていません。
制約を変更しているコードはどこにありますか?
viewWillAppear:に保持している場合は、その問題が発生します。 viewDidLayoutSubviewsはiOS8でうまく機能しますが、iOS7では必ずしもうまく機能しないことがわかりました。
最終的に、viewDidLayoutSubviewsを使用できない場合は、コンテナビューをviewDidLoadで非表示にし、viewWillAppearで再表示することをお勧めします。制約が適用されました。画面をロードするときに少し余分な遅延が発生しますが、制約の変更はユーザーに対して透過的になります。
私にとって、それは私のプロジェクトのタブバーの問題でした。そのビューでは必要なかったので、プッシュで非表示にしました。そのため、ビューがスタックにプッシュされると、バーが非表示になり、それに応じて制約が調整されました。だから私はタブバーを元に戻しました。
同様の問題があり、他の回答で提案されているように、アイテムを非表示にして表示する準備として、アイテムをコンテナビューに配置しました。
私はそれを解決策として気に入らなかったので、結局それをする必要がなくなりました。
コントローラのビューにペグされたコンテナビューにそれらを配置するだけで、問題の発生を防ぐことができました。