web-dev-qa-db-ja.com

ビューが削除されると、制約がどうなるか

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

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

たとえば、サブビューCおよびAを持つコンテナBを用意します。コンテナCにはいくつかの制約があります。次に、[A removeFromSuperview]を呼び出します。 Aの制約はどうなりますか?

ACに再度追加するとどうなりますか?

104
Sulthan

制約が削除されます。 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];
    }
}
112
rdelmar

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

UIViewのremoveFromSuperviewメソッドの documentation の状態:

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

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

38
Evan Stone

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

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

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

3

[A removeFromSuperview]

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

2
Mike Pollard

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

1
Andrea

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

0
William Hu