NSLayoutConstraint
(iOS 8.0
)にはBOOL
と呼ばれるactive
プロパティがあり、レイアウト制約をオンザフライで簡単に無効/有効にできます。
プログラムで有効/無効にできるViewControllerの2番目のレイアウトセットを作成するには(両方のセットでIBOutletCollection
のNSLayoutConstraints
を使用)、定義済みのレイアウト制約を無効にする必要があります。インターフェイスビルダーで。
ここで、それらを削除したくないことを明確にしておきます。それらを無効にするだけで、インターフェイスビルダーが制約の不一致について常に文句を言うことなく2番目のセットを設計できます。さらに、レイアウトセットは1つの同じサイズクラスを対象としているため、サイズクラスの切り替えはオプションではありません。
そうするオプションはありますか?
前もって感謝します
マルタ
さらに詳しい情報: SDK Version: 8.1
Deployment Target 8.0
ストーリーボードで無効にする制約を選択し、 Option+Command+4 属性インスペクターを表示するには、[インストール済み]の選択を解除します。
以前はGabblerが提供するソリューションを正常に使用していましたが、最近Swift 2.0とXcode7を使用して同じことを試したところ、機能しなくなったことがわかりました。インストールされていないものとして設定された制約は、予想されるように、まったくインストールされておらず、オンまたはオフに切り替えてもレイアウトに影響はありませんでした。
この問題に対する私の解決策は、すべての制約がインストールされていることを確認し、キー「active」、タイプ「boolean」、値「false」を使用してユーザー定義のランタイム属性を追加することでした。
ユーザー定義のランタイム属性パネルは、カスタムクラスフィールドの下のIDインスペクターにあります。
この特定のケースでは、コードで制約を宣言します。
// 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つ)の外観を反映するように、実行時に削除される制約を設定できます。制約を作成し、「ビルド時に削除」属性をチェックするだけです。
これが達成すること:
唯一の欠点は、InterfaceBuilderがレイアウトを完全に表現できないことです。
Xcode8とSwift 3を警告なしで使用する私のソリューションは、Interface Builderの[Inspector]タブのInstalledボックスのチェックを外しました:
次に、IBOutletsを作成し、プログラムでviewDidLayoutSubviews()に追加/削除します。
view.removeConstraints([constraints to remove, ...])
view.addConstraints([constraints to add, ...])
必ず最初に制約を削除してください。そうしないと、メッセージログが表示されます制約を同時に満たすことができません...