UITabBarControllerと同じようにカスタムスイッチコントローラーがありますが、スイッチアニメーションがあります。そして、私は達成するために自動レイアウトを使用しています。
子コントローラー間の切り替えは動的であるため、IBの事前セットアップではなく、ビューがコンテナーのビューに追加されると、適切な制約が子ビューコントローラーに追加されます。 (もちろん、制約はスーパービューに追加されます)
http://d.pr/i/q6NF Container Controller Nib Setup
PS:制約の詳細
H:| [子](制約の定数をアニメーションに左/右から右/左に変更します)
H:[子供(==スーパー)]
V:| [子供] |
子コントローラーの1つはナビゲーションコントローラーです。ナビゲーションコントローラーがモーダルビューコントローラーを表示すると(presentViewController:animated:completion:
を使用して)、ナビゲーションのフレームを表示/終了した後にそれを終了すると(dismissViewControllerAnimated:completion:
を使用して)、問題が発生しますコントローラーは(x、y、0、0)、になります自動レイアウトが無効になっているようです、おそらく制約が削除されています
http://d.pr/i/VmvL 現在/却下プロセス
これらの制約に何が起こるかを確認するためのコードはまだ使用していませんが、Spark Inspectorを使用すると、現在のプロセス/終了プロセス中にビューのプレゼンテーションの変更が表示されます。ナビゲーションコントローラーがモーダルビューコントローラーを表示するとき、iOSだけswapナビゲーションコントローラーのビュー全体をモーダルビューコントローラーのビューに切り替えます。ナビゲーションコントローラーのビューに戻ると、自動レイアウトは機能しなくなります。
私が思いついた解決策の1つは、コンテナーコントローラーにモーダルコントローラーを提示させることです。
または、コンテナーコントローラーを自動レイアウトなしに変更するだけです。
私が自動レイアウトを使い始めて以来、このテクニックが引き起こす問題は、利点を支配するだけです。 この問題に加えて、インターフェイスの向きが変わるたびに、コンテナコントローラ内のビューは自動レイアウトできません。サブビューは常に方向変更前のスーパービュー。設定した制約を再確認します。競合や曖昧さはありません。
私の推測は、私のカスタムコンテナーコントローラーは、自動レイアウトシステムでのモーダルビューコントローラーおよびインターフェイスの向きの変更の提示と互換性がなく、制約が設定されている場合でも同じです。
Xcode 5ベータ、iOS 7SDK、ターゲットiOS6.1たぶんSDK環境に問題がありますか?
同様の問題 がありました。ルートUIViewにtranslatesAutoresizingMaskIntoConstraints = NO;
を設定していました。 「最も外側の」UIViewが表示されます-階層のルートのスーパービューはデフォルトのtranslatesAutoresizingMaskIntoConstraints = YES
を使用する必要があります。これを削除すると、すべてが期待どおりに機能しました。
おそらくあいまいな制約が原因です。実行中のアプリケーションを一時停止して、コンソールに次のコマンドを入力することをお勧めします。
po [[UIWindow keyWindow] _autolayoutTrace]
UIWindow
とルートビューの間で自動レイアウトを使用する場合(UIWindow
全体を埋めるようにルートビューを設定するため)、これらの制約は別のビューコントローラーの全画面表示によって吹き飛ばされます。
何が起こるかというと、フルスクリーンプレゼンテーションの階層全体がUIWindow
以下のすべてを置き換えます-元のビューが削除され(制約が吹き飛ばされ)、新しいビュー階層が置き換えられます。その後、レビューを置き換えると、これらの制約は失われます。 viewWillAppear:
のような場所に再作成するか、ルートビューにself.view.translatesAutoresizingMaskIntoConstraints = NO;
があることを確認する必要があります。
私も同じ問題を抱えており、このナビゲーションコントローラーを試したところ、正常に機能しましたが、現在のビューコントローラーでは機能しませんでした。この問題を解決するには、translatesAutoresizingMaskIntoConstraintsとともに以下のビューコントローラーメソッドを使用してください。
-(void) viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
self.view.translatesAutoresizingMaskIntoConstraints = NO;
}
気になることがありましたらお知らせください。ありがとう
私は同じ問題を抱えていましたが、検索バーコンテナーが誤って配置された要素(UIViewController内、UITabBarController内)でした。私が見た他のソリューションはどれも機能しませんでしたが、最終的にはviewWillAppearにレイアウト制約を再度追加することで解決できました。
[self.view addConstraint:[NSLayoutConstraint constraintWithItem: self.searchBar.superview
attribute: NSLayoutAttributeTop
relatedBy: NSLayoutRelationEqual
toItem: self.view
attribute: NSLayoutAttributeTop
multiplier: 1
constant: 0]];
自動レイアウトでレイアウトしていたのと同じように、テーブルビューのセルにも問題がありました。モーダルビューから戻ると、セルのレイアウトが無効でした。 viewDidAppearの後に各セルを再レイアウトすることはできましたが、ひどく見えました。 @palimondoの提案のおかげで、私はtranslatesAutoresizingMaskIntoConstraints
の周りをスニッフィングし始めました。テーブルビューセルのコンテンツビューをtranslatesAutoresizingMaskIntoConstraints = NO
に設定するべきではなかったことがわかりました。