web-dev-qa-db-ja.com

ストーリーボードから追加された制約をプログラムで削除する方法は?

Googleで検索しましたが、答えが見つかりません。だから私は尋ねる必要があります。ホーム画面が1つあります。ユーザーがログインすると、次のように1つのビューが表示されます enter image description here ユーザーがログアウトしてホームページにアクセスすると、上記のレイアウトが表示されますが、中央のボックスレイアウトは表示されません。そのレイアウトを非表示に設定すると、次のように表示されます。 enter image description here

3番目のレイアウトを少し上に移動して、空白を削除したい。

ストーリーボードを使用して制約を追加しました。プログラミングから制約を削除し、レイアウトを以下の最初のレイアウトに設定する制約を1つ追加する必要があります。

35
Dharmik

@Henitが述べたように、制約にもIBOutletを設定できます。

例えば、

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

そのため、次のようにこの制約を削除できます。

[myView removeConstraint: viewHeight];

または、ビューに関連するすべて/複数の制約を削除する場合は、

[myView removeConstraints: constraintsArrayHere]; // custom array of constraints references
[myView removeConstraints: [myView constraints]]; //all constraints

その後、addConstraintまたはaddConstraintsメソッドを使用して、同じ方法で新しい制約を追加できます。

詳細については、Apple Documentation here。

お役に立てれば。

34
Mrunal

removeConstraintsは将来廃止される予定です。

以下を代替として使用できます

viewHeight.active = NO;
24
Megamind

@Megamindの答えを拡張するには、activeNSLayoutConstraintプロパティを使用できます。 2つのケースに2つの異なる制約を設定し、ログインステータスに応じてそのうちの1つだけをアクティブにします。 InterfaceBuilderでは、activeプロパティは奇妙にInstalledと呼ばれます:

Login constraintRegister constraint

次に、コードで2つのスイッチを切り替えます。

- (void)setupRegistrationView
{        
    _loadingIndicatorTopConstraintLogin.active = NO;
    _loadingIndicatorTopConstraintRegister.active = YES;
}

- (void)setupLoginView
{        
    _loadingIndicatorTopConstraintLogin.active = YES;
    _loadingIndicatorTopConstraintRegister.active = NO;
}

ところで、新しいUIStackViewを使用すると、よりエレガントなソリューションが提供される場合がありますが、それは別のトピックです。

12
AXE

ユーザーがログアウトしたときに非表示にするビューの高さ制限のIBOutletを取得します。

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

NSLayoutConstraintクラスには、1つのプロパティ定数があります。ユーザーがログイン/ログアウトするときに設定する必要があります。

viewHeight.constant = isLoggedIn ? 30.0 : 0.0;

お役に立てれば..

11
Henit Nathwani

IOS 10以降では、ビューのすべての制約を単純に反復処理して非アクティブ化できます。あなたなら、例えばビューの高さの制約を見つけて削除するには、次の操作を実行できます。

for constraint in constraints {
    guard constraint.firstAnchor == heightAnchor else { continue }
    constraint.isActive = false
    break
}

[〜#〜]代替[〜#〜]
ワンライナーです。ビュー内にいる場合は、次のように書くことができます。

constraints.first { $0.firstAnchor == heightAnchor }?.isActive = false
8
blackjacx

In Swift 4

@IBOutlet weak var viewHeight: NSLayoutConstraint!
viewHeight.isActive = false    

ハッピーコーディング:)

7
Ariven Nadar

他の方法でもできます。 30になる3番目のレイアウトと最初のレイアウトの間に垂直間隔の制約を追加します。次に、コントローラーの制約への参照を追加します。

self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0

PS:この場合、中央のビューに高さの制約を追加しないでください。 4つの末尾、先頭、先頭(最初のレイアウトへ)、および末尾(3番目のレイアウトへ)を追加するだけです。

2

非表示にするビューの高さ制約を追加できます。そして、viewcontroller.hファイルにその高さの制約用のNSlayoutHeightcontraintアウトレットを追加します。その後、必要な場所でviewcontroller.mファイルでそのheightConstrainアウトレットを呼び出すことができます。このUIviewを非表示にする場所に次のコードを追加します。

_heightconstrainOutlet.constant=0;

その高さがゼロになります。そのため、底面もその領域をカバーします。底面ビューに高さの制約があり、コンテナへの底面の制約がある場合は?要件のいずれかを削除してください。ありがとうございます。

1

セル内に別のtableViewがあるtableViewでも同様の問題があり、セルが再利用されるにつれて高さの制約が積み重なっていきました。これを解決するために私はやった:

constraints.filter({$0.firstAnchor == heightAnchor }).forEach{ $0.isActive = false }
0
Tharak