ビューが削除されたときに制約で何が起こるか


109

私の質問は単純ですが、ドキュメントに情報が見つかりませんでした。

ビューがビュー階層から削除される(または別のビューに移動される)と、レイアウト制約はどうなりますか?

たとえば、CサブビューAとのコンテナがあるとしBます。コンテナにCはいくつかの制約があります。次にを呼び出します[A removeFromSuperview]。何がための制約で起こりますかA

再度追加AするCとどうなりますか?

回答:


118

制約が削除されます。もう一度Aを追加する場合は、新しい制約を作成する必要があります。または、Aを削除する前に制約を保存しておくと、元に戻すことができます。このようなことを行うと、view1というビューのこのような制約を保存します。

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}

7
この事実はドキュメントのどこかにありますか?私はあなたを信じていますが、どこにも言及されていないことは奇妙に思われます。
スルタン

2
ビューとともに制約が実際に削除されるのは常識です。それらがなかった場合、レイアウトシステムは将来のパスでそれらをどのように評価できるでしょうか?
Mike Pollard、2013

6
この答えがそうであるように思われるので、それはまだ途方もなく非常に役に立ちました!
race_carr 14年

1
@pnollet、私はその質問のポスターがなぜ彼がしたことをしたのか分かりません。これをログに記録して確認し、サブビューを削除してスーパービューの制約を確認すると、削除されたサブビューに関連する制約が失われています。
rdelmar 14

4
@フィロ、私はそれらが削除されるはずだと確信しているので、それらがiOS 6にない場合、それはおそらくバグです。ところで、removeFromSuperviewメソッドのドキュメントには、「このメソッドを呼び出すと、削除するビューを参照する制約、または削除するビューのサブツリー内のビューを参照する制約がすべて削除されます」と記載されています。
rdelmar 2014

41

私もこの質問を持っていたので、キックのためにApple Docsをチェックしたところ、制約が削除されたことが文書化されていることがわかりました。

UIView removeFromSuperviewメソッドのドキュメントには、次のように記載されています。

このメソッドを呼び出すと、削除するビューを参照する制約、または削除するビューのサブツリー内のビューを参照する制約が削除されます。

これが元の質問が投稿されたときに昨年文書化されたかどうかはわかりませんが、誰かがそれを必要とする場合に備えて、この情報を共有すると思いました...


これをドキュメントから直接追加していただきありがとう
ございます

3

ただし、2つの独立した親ビューAとB、およびサブビューC(Cは現在Aのサブビューであり、適切な制約がある)がある場合、[B addSubview:C]を呼び出してもAに関する制約はクリアされないことに注意してください。そしてC、そして自動レイアウトは例外を投げ始めます、なぜならそれらの制約はもはや同じ階層のビューに関係しないからです。

CをBに追加する前に、[C removeFromSuperview]を明示的に呼び出して制約を削除する必要があります。

これはMac OS Xにも当てはまります-iOSをチェックしていません


面白い!この情報はどこで入手しましたか?addSubviewのドキュメントでは、この動作については触れられていません。私は現在、ビューコントローラーを削除するときに、「ビューに制約をインストールできません」という、散発的な例外があるので、質問しています。
JimmyB 2017

2

制約は、次の場合にも削除されます [A removeFromSuperview]

それらは忘れられ、AをCに追加しても制約は追加されません。


0

それらも削除され、簡単なテストを行うことができます。ビューSUBVIEWを取得し、SUBVIEWがそのスーパービューのサイズ変更に追従するように制約するコストラインを作成します(エッジをスーパービューに接続するように)。これを行うには、このCONTAINERVIEWにサブビューとしてSUBVIEWを追加し、次のような制約として追加します
。V:|-[SUBVIEW]-|
H:|-[サブビュー]-|
これらの制約はSUBVIEWスーパービュー、つまりCONTAINERVIEWに追加する必要があります。
すべてのCONTAINERVIEW制約をチェックするだけでSUBVIEWを削除すると、2つがもはや存在しないことがわかります。


0

この質問は、インターフェイスビルダーでも証明できます。追加の制約にa UIViewをドラッグアンドドロップしてからViewControllerを削除するUIViewと、青い制約が消えているのがわかります。


4
ストーリーボードは、ランタイム動作がどのように発生するかについては何も証明しません。ストーリーボードは何でも好きなことができます!
mxcl 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.