Googleで検索しましたが、答えが見つかりません。だから私は尋ねる必要があります。ホーム画面が1つあります。ユーザーがログインすると、次のように1つのビューが表示されます ユーザーがログアウトしてホームページにアクセスすると、上記のレイアウトが表示されますが、中央のボックスレイアウトは表示されません。そのレイアウトを非表示に設定すると、次のように表示されます。
3番目のレイアウトを少し上に移動して、空白を削除したい。
ストーリーボードを使用して制約を追加しました。プログラミングから制約を削除し、レイアウトを以下の最初のレイアウトに設定する制約を1つ追加する必要があります。
@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。
お役に立てれば。
removeConstraintsは将来廃止される予定です。
以下を代替として使用できます
viewHeight.active = NO;
@Megamindの答えを拡張するには、active
のNSLayoutConstraint
プロパティを使用できます。 2つのケースに2つの異なる制約を設定し、ログインステータスに応じてそのうちの1つだけをアクティブにします。 InterfaceBuilderでは、active
プロパティは奇妙にInstalled
と呼ばれます:
次に、コードで2つのスイッチを切り替えます。
- (void)setupRegistrationView
{
_loadingIndicatorTopConstraintLogin.active = NO;
_loadingIndicatorTopConstraintRegister.active = YES;
}
- (void)setupLoginView
{
_loadingIndicatorTopConstraintLogin.active = YES;
_loadingIndicatorTopConstraintRegister.active = NO;
}
ところで、新しいUIStackViewを使用すると、よりエレガントなソリューションが提供される場合がありますが、それは別のトピックです。
ユーザーがログアウトしたときに非表示にするビューの高さ制限のIBOutletを取得します。
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;
NSLayoutConstraintクラスには、1つのプロパティ定数があります。ユーザーがログイン/ログアウトするときに設定する必要があります。
viewHeight.constant = isLoggedIn ? 30.0 : 0.0;
お役に立てれば..
IOS 10以降では、ビューのすべての制約を単純に反復処理して非アクティブ化できます。あなたなら、例えばビューの高さの制約を見つけて削除するには、次の操作を実行できます。
for constraint in constraints {
guard constraint.firstAnchor == heightAnchor else { continue }
constraint.isActive = false
break
}
[〜#〜]代替[〜#〜]
ワンライナーです。ビュー内にいる場合は、次のように書くことができます。
constraints.first { $0.firstAnchor == heightAnchor }?.isActive = false
In Swift 4
@IBOutlet weak var viewHeight: NSLayoutConstraint!
viewHeight.isActive = false
ハッピーコーディング:)
他の方法でもできます。 30になる3番目のレイアウトと最初のレイアウトの間に垂直間隔の制約を追加します。次に、コントローラーの制約への参照を追加します。
self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0
PS:この場合、中央のビューに高さの制約を追加しないでください。 4つの末尾、先頭、先頭(最初のレイアウトへ)、および末尾(3番目のレイアウトへ)を追加するだけです。
非表示にするビューの高さ制約を追加できます。そして、viewcontroller.hファイルにその高さの制約用のNSlayoutHeightcontraint
アウトレットを追加します。その後、必要な場所でviewcontroller.mファイルでそのheightConstrain
アウトレットを呼び出すことができます。このUIview
を非表示にする場所に次のコードを追加します。
_heightconstrainOutlet.constant=0;
その高さがゼロになります。そのため、底面もその領域をカバーします。底面ビューに高さの制約があり、コンテナへの底面の制約がある場合は?要件のいずれかを削除してください。ありがとうございます。
セル内に別のtableViewがあるtableViewでも同様の問題があり、セルが再利用されるにつれて高さの制約が積み重なっていきました。これを解決するために私はやった:
constraints.filter({$0.firstAnchor == heightAnchor }).forEach{ $0.isActive = false }