web-dev-qa-db-ja.com

InterfaceBuilderでのNSLayoutConstraintsの有効化/無効化

NSLayoutConstraintiOS 8.0)にはBOOLと呼ばれるactiveプロパティがあり、レイアウト制約をオンザフライで簡単に無効/有効にできます。

プログラムで有効/無効にできるViewControllerの2番目のレイアウトセットを作成するには(両方のセットでIBOutletCollectionNSLayoutConstraintsを使用)、定義済みのレイアウト制約を無効にする必要があります。インターフェイスビルダーで。

ここで、それらを削除したくないことを明確にしておきます。それらを無効にするだけで、インターフェイスビルダーが制約の不一致について常に文句を言うことなく2番目のセットを設計できます。さらに、レイアウトセットは1つの同じサイズクラスを対象としているため、サイズクラスの切り替えはオプションではありません。

そうするオプションはありますか?

前もって感謝します

マルタ

さらに詳しい情報: SDK Version: 8.1Deployment Target 8.0

14
Malte

ストーリーボードで無効にする制約を選択し、 Option+Command+4 属性インスペクターを表示するには、[インストール済み]の選択を解除します。

27
gabbler

以前はGabblerが提供するソリューションを正常に使用していましたが、最近Swift 2.0とXcode7を使用して同じことを試したところ、機能しなくなったことがわかりました。インストールされていないものとして設定された制約は、予想されるように、まったくインストールされておらず、オンまたはオフに切り替えてもレイアウトに影響はありませんでした。

この問題に対する私の解決策は、すべての制約がインストールされていることを確認し、キー「active」、タイプ「boolean」、値「false」を使用してユーザー定義のランタイム属性を追加することでした。

ユーザー定義のランタイム属性パネルは、カスタムクラスフィールドの下のIDインスペクターにあります。

13
Ash

この特定のケースでは、コードで制約を宣言します。

// Card View Animatable Constraints
private lazy var cardViewHeightConstraint: NSLayoutConstraint = cardView.heightAnchor.constraint(equalToConstant: 500)
private lazy var cardViewEqualHeightConstraint: NSLayoutConstraint = cardView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.8)

その後、いつでもアクティブ化または非アクティブ化できます。

override func viewDidLoad() {
    super.viewDidLoad()

    cardViewHeightConstraint.isActive = true
    cardViewEqualHeightConstraint.isActive = false
}

そして、あなたはまだインターフェースビルダーであなたのレイアウトのほとんどをすることができます。 Interface Builderがレイアウト(または少なくとも1つ)の外観を反映するように、実行時に削除される制約を設定できます。制約を作成し、「ビルド時に削除」属性をチェックするだけです。

In a constraint's size or attribute inspector, check the "Remove at build time" box.

これが達成すること:

  • レイアウトのほとんどで引き続きInterfaceBuilderを使用する必要があります
  • IBの警告はありません
  • できます。

唯一の欠点は、InterfaceBuilderがレイアウトを完全に表現できないことです。

2
Pomme2Poule

Xcode8とSwift 3を警告なしで使用する私のソリューションは、Interface Builderの[Inspector]タブのInstalledボックスのチェックを外しました:

Installed box on Interface builder

次に、IBOutletsを作成し、プログラムでviewDidLayoutSubviews()に追加/削除します。

view.removeConstraints([constraints to remove, ...])
view.addConstraints([constraints to add, ...])

必ず最初に制約を削除してください。そうしないと、メッセージログが表示されます制約を同時に満たすことができません...

2
rgkobashi