2016-08-22 16 views
2

私はUIScrollViewを持っています。その中には、ScrollViewのContentSizeを定義するUIViewがあります。 ContentViewの内部には、すべて同じ幅(最大幅)のビューがあり、すべてがSuperview(UIScrollViewの上でさえ)に比例する高さを持っています。 セットアップが完全に機能し、スクロールが機能します。autolayout NSLayoutConstraintsを有効/無効にする

ここでは、表示されるコンテンツがない場合、これらのUIViewの1つを非表示にしたいので、残りの空白を埋めるように他のビューのサイズを変更します。

私は、その特定のUIViewの高さの制約をSuperviewに対して0.3の乗数で設定しました。 正確に同じUIViewの2番目の高さ制約を0.01の乗数で完全に同じSuperViewに追加しましたが、実行時に影響を与えないようにします。 (私は状況をテストしました。もし私が0.3の乗数を低い優先度に、0.01の乗数を高い優先度に置くと、すべてが完全にサイズ変更されます。

は今、私は私のヘッダファイル内の接続を持つ2つのアウトレットを作成し、ここで私は変更をしたいとき、私が使用するコードです:

//DescriptionViewNormalConstraint is the 0.3 height one, with 1000 priority 
     descriptionViewNormalConstraint.active = NO; 
//DescriptionViewInvisibleConstraint is the 0.01 height one, with 500 priority 
     descriptionViewInvisibleConstraint.active = YES; 
     [self.view setNeedsLayout]; 
     [self.view layoutIfNeeded]; 

しかし、これは動作しません。実際、それは何も変わりません。 私はここで何が欠けていますか?

+0

doens'tは何を意味しますか? 'descriptionViewNormalConstraint'がアクティブのままであることを意味しますか? – ddb

+0

はい、もう一方の制約は機能しません。あるいは、それは有効になっているかもしれませんが、自動レイアウトは "リフレッシュ"されません。 –

+0

これらの制約を適用した特定のビューに対して 'setNeedsLayout'と' layoutIfNeeded'を呼び出そうとしましたか? – ddb

答えて

2

解決策は、両方の制約の優先順位を変更する必要があるということでした。 デフォルトで使用する制約には、1000より低い優先順位を設定します。たとえば、750です。 他の制約の優先順位を250に設定します(ストーリーボードの場合)。

2番目の制約を最初のものに置き換えたい場合は、2番目の制約の優先度を250から750以上のものに変更するだけで、魔法のように動作します。

+0

あなたは私の救い主です。私は 'titleLabelToDescriptionLabelConstraint.active = hasDescription' のように制約をトグルしようとしていましたが、これはすべての制約をインストール済み/アクティブに設定し、デフォルト優先順位を750に設定しました。 'titleLabelToDescriptionLabelConstraint.priority = hasDescription? 751:250'を動的にサイズ変更したテーブルビューのセル – loudmouth

+1

すばらしい答え、ありがとう。 751や250のような乱数の使用を避けるために、利用できる定数は 'UILayoutPriorityDefaultLow'と' UILayoutPriorityDefaultHigh'です。優先度が 'UILayoutPriorityRequired'(1000)の制約の優先度を変更しようとすると、実行時例外が発生することにも注意してください。 – Ben

0

あなたはそれを無効にした後、あなたは、単にそれが次のコード

[myCustomView removeConstraint:descriptionViewNormalConstraint]; 

とに適用し、その後、リフレッシュされたビューからその制約を削除することができdescriptionViewNormalConstraint再アクティブする必要はありません。

+0

これはなぜ動作しないのかわかりません。私はそれをすべて試しました:私はすべての子ビューとスーパービューでsetNeedsLayoutとlayoutIfNeededを設定しています。私は制約を削除しました、私はそれを無効にして、もう1つをアクティブにし、他の制約の優先順位を1500に設定します...私はそれを取得しません。 –

+0

ビューの 'setNeedsLayout'ではなく' setNeedsUpdateConstraints'を呼び出してみてください。 – ddb

関連する問題