2013-09-04 5 views
84

私が持っている質問は単純ですが、ドキュメントには何の情報も見つかりませんでした。ビューが削除されたときに制約がどのように発生するか

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

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

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

答えて

97

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

この事実はドキュメントのどこかにありますか?私はあなたを信じていますが、事実がどこにも言及されていないのは奇妙なようです – Sulthan

+1

ビューと一緒に制約が削除されるのは常識です。もしレイアウトシステムが将来のパスでそれらを評価することができないのであれば? –

+5

この答えが明らかであるように、それはそうであるように思われますが、それはまだ非常に有用でした! –

2

あなたは[A removeFromSuperview]

彼らは忘れて、再びCに追加すると、何の制約を追加していないとき制約も削除されます。

1

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

31

私もこの質問をしていたので、Apple Docsを試してみましたが、制約が取り除かれたことが文書化されています。

のUIView removeFromSuperview方法の状態のdocumentation

このメソッドを呼び出すには、あなた が削除されているビューを参照するすべての制約を削除し、またはそれはあなたが あるビューのサブツリー内の任意のビューを参照してください。除去する。

私は、これは元の質問が投稿されたときに、昨年文書が、私はちょうど私が誰がそれを必要とする場合には、この情報を共有したいと思っていた場合...

+0

ドクターからこれを直接追加してくれてありがとう – Esko918

3

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

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

これは、Mac OS X上で真である - 私はこの質問はまた、インターフェイスビルダーによって証明することができるのiOS

+0

面白い!あなたはどこでこの情報を入手しましたか? addSubviewのドキュメントにはこの動作については言及していません。 私は現在、散発的な例外があるので、View Controllerを削除すると「ビューに制約をインストールできません」と表示されています。 – JimmyB

0

をチェックしていません。 UIViewViewControllerにドラッグアンドドロップすると、制約が追加されてUIViewが削除されると、青い拘束が消えることがわかります。

+0

これはうまくいかないと思っています。 –

+0

ストーリーボードは、実行時の動作がどのように発生するかについては何も証明していません。ストーリーボードは何でもできます! – mxcl

関連する問題