123

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

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

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

もう一度追加Aするとどうなるでしょうか。C

4

6 に答える 6

128

The constraints are removed. If you add A again, you will have to make new constraints for it, or if you save the constraints before you remove A, you can add them back. When I do something like this, I save the constraints like this for a view called 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];
    }
}
于 2013-09-04T15:44:07.383 に答える
48

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

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

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

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

于 2015-07-07T22:25:25.277 に答える
2

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

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

于 2013-09-04T15:44:59.200 に答える
0

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

于 2013-09-04T15:45:12.637 に答える