web-dev-qa-db-ja.com

NSLayoutConstraintを削除する正しい方法

私のアプリでは、制約を使って多くの作業を行っています。ほとんどの場合、アニメーションも使用しています。特定の状況では、制約を削除して新しい制約を追加する必要があります。

IOS 7もサポートする必要があるため、activeプロパティを使用できません。これは、他の方法で解決できます。

制約を削除する方法は、removeConstraintUIViewメソッドを使用することです。

次のようなメソッドを作成することは可能ですか?

constraint.remove()

したがって、どのビューが制約を処理しているかを知る必要はありませんか?

15
Antoine

autoRemoveライブラリによって提供されるメソッドPureLayoutを使用することになりました: https://github.com/smileyborg/PureLayout

このメソッドは、firstItemまたはsecondItemを使用してcommonSuperviewを検索し、正しいビューから制約を削除します。

その結果、この1つのライナーが作成されました。

containerTopConstraint.autoRemove()
6
Antoine

私がしていることは、追加/削除できるようにしたい制約の配列を作成し、単に以下を使用することです。

@property NSMutableArray *newConstraints;

newConstraintsを埋めます

iOS7およびiOS8:

[self.viewToChange addConstraints:self.newConstraints];
[self.viewToChange removeConstraints:self.newConstraints];

またはiOS8のみ、新しいメカニズムを使用します

[NSLayoutConstraint activateConstraints:self.newConstraints];
[NSLayoutConstraint deactivateConstraints:self.newConstraints];

これにより、セットを適用したり、セットを削除したり、新しいセットを適用したりできます。

どの制約がどれであるかを識別できる場合は、ストーリーボードセットから初期リストを作成することもできます。

15
Rory McKinnel

いいえ、私が知っていることではありません。ホストビューの自動管理はiOS8でのみ提供されました。

醜い実装は、すべてのビューのすべての制約をループして、それが存在するビューを見つける可能性があります。

ただし、通常、制約がどのビューで定義されているかを常に把握できる方法で制約を管理することは難しくありません。

0
dasdom