web-dev-qa-db-ja.com

ビューコントローラー(および多くの状況)を提示した後、自動レイアウトが無効になる

バックグラウンド:

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環境

Xcode 5ベータ、iOS 7SDK、ターゲットiOS6.1たぶんSDK環境に問題がありますか?

31
Michael Hui

同様の問題 がありました。ルートUIViewにtranslatesAutoresizingMaskIntoConstraints = NO;を設定していました。 「最も外側の」UIViewが表示されます-階層のルートのスーパービューはデフォルトのtranslatesAutoresizingMaskIntoConstraints = YESを使用する必要があります。これを削除すると、すべてが期待どおりに機能しました。

33
Palimondo

おそらくあいまいな制約が原因です。実行中のアプリケーションを一時停止して、コンソールに次のコマンドを入力することをお勧めします。

po [[UIWindow keyWindow] _autolayoutTrace] 
12
Tomáš Linhart

UIWindowとルートビューの間で自動レイアウトを使用する場合(UIWindow全体を埋めるようにルートビューを設定するため)、これらの制約は別のビューコントローラーの全画面表示によって吹き飛ばされます。

何が起こるかというと、フルスクリーンプレゼンテーションの階層全体がUIWindow以下のすべてを置き換えます-元のビューが削除され(制約が吹き飛ばされ)、新しいビュー階層が置き換えられます。その後、レビューを置き換えると、これらの制約は失われます。 viewWillAppear:のような場所に再作成するか、ルートビューにself.view.translatesAutoresizingMaskIntoConstraints = NO;があることを確認する必要があります。

6
Rob Glassey

私も同じ問題を抱えており、このナビゲーションコントローラーを試したところ、正常に機能しましたが、現在のビューコントローラーでは機能しませんでした。この問題を解決するには、translatesAutoresizingMaskIntoConstraintsとともに以下のビューコントローラーメソッドを使用してください。

-(void) viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    self.view.translatesAutoresizingMaskIntoConstraints = NO;
}

気になることがありましたらお知らせください。ありがとう

4
chandan

私は同じ問題を抱えていましたが、検索バーコンテナーが誤って配置された要素(UIViewController内、UITabBarController内)でした。私が見た他のソリューションはどれも機能しませんでしたが、最終的にはviewWillAppearにレイアウト制約を再度追加することで解決できました。

[self.view addConstraint:[NSLayoutConstraint constraintWithItem: self.searchBar.superview
                                                      attribute: NSLayoutAttributeTop
                                                      relatedBy: NSLayoutRelationEqual
                                                         toItem: self.view
                                                      attribute: NSLayoutAttributeTop
                                                     multiplier: 1
                                                       constant: 0]];
0
Paul

自動レイアウトでレイアウトしていたのと同じように、テーブルビューのセルにも問題がありました。モーダルビューから戻ると、セルのレイアウトが無効でした。 viewDidAppearの後に各セルを再レイアウトすることはできましたが、ひどく見えました。 @palimondoの提案のおかげで、私はtranslatesAutoresizingMaskIntoConstraintsの周りをスニッフィングし始めました。テーブルビューセルのコンテンツビューをtranslatesAutoresizingMaskIntoConstraints = NOに設定するべきではなかったことがわかりました。

0
Phil Viso