2016-05-12 17 views
3

UIVisualEffectViewにサブビューとして追加したい小さな情報ビューを作成しました。私の情報ビューでは、フリーフォームのxibを作成し、すべてのUILabelsと1つのUIButtonにAuto Layoutを使用しました。ここでの目標は、スタート、プルスレートはすべてオプションです。そのデータが存在しない場合は、それらのUILabelsを折りたたみたいと思います。私は物事がきちんとしてドンいるので、これらのオプションのUIlabels崩壊の一部またはすべてが、私はUIViewのフレームの高さを更新したいときは0です。自動レイアウト定数を変更してもフレームが更新されない

私の問題に自分の等しい高さ制約を更新することによって、これを達成しました潜在的にギャップがある。

enter image description here

私はIBでタグ付けしました制約を更新するには、以下行います。

for view in self.view.subviews { 
     for constraint in view.constraints { 
      if let identity = constraint.identifier { 
       if labelTags.contains(identity) { 
        print("Before: \(view.frame)") 
        constraint.constant = labelHeight 
        view.setNeedsUpdateConstraints() 
        print("After: \(view.frame)") 
       } 
      } 
     } 
    } 

Before: (5.0, 101.0, 50.0, 25.0) 
After: (5.0, 101.0, 50.0, 25.0) 
Before: (58.0, 101.0, 101.0, 25.0) 
After: (58.0, 101.0, 101.0, 25.0) 
Before: (5.0, 129.0, 39.0, 25.0) 
After: (5.0, 129.0, 39.0, 25.0) 
Before: (47.0, 129.0, 23.0, 25.0) 
After: (47.0, 129.0, 23.0, 25.0) 
Before: (5.0, 157.0, 45.0, 25.0) 
After: (5.0, 157.0, 45.0, 25.0) 
Before: (53.0, 157.0, 63.0, 25.0) 
After: (53.0, 157.0, 63.0, 25.0) 

制約が更新された後、私はループによってビューのサブビューをビューのフレームを決定し、そのような最大の高さを取得しようとすると:

var height:CGFloat = 0.0 
    for v in self.view.subviews { 
     if (v.frame.origin.y + v.frame.size.height) > height { 
      height = (v.frame.origin.y + v.frame.size.height) 
     } 
    } 

    self.frame.size.height = height 

最初のロードで新しいフレームの高さは」doesnの取得は、制約を更新した後にUILabelsフレームが更新されないため、動作しません。ここでキッカーは、同じコードが方向変更に実行され、それは動作します!私が戻って肖像画に戻るときに私のUILabelsはうまく整列され、UIViewUIButtonの下にぴったりと引き上げられます!

いずれの方向にも大変感謝しています。私はこの2日間行ってきました。ありがとう!

UPDATE:

self.view.layoutIfNeeded()は確かに勝者でした!私の場合、タイミングはすべてでした。

私はその細心の注意を払ったことはありませんが、以下はlayoutIfNeeded()が即時であるところのOSへの「示唆」のようです。

self.view.setNeedsUpdateConstraints() 
self.view.setNeedsLayout() 
self.view.setNeedsDisplay() 
+0

'view.setNeedsUpdateConstraints()を呼び出すと、すぐにレイアウトが行われることはありません。そのために 'view.layoutIfNeeded()'を呼び出します。 – dan

答えて

5
自動レイアウト制約の変更を持っているビューに再描画を強制します

コールlayoutIfNeeded()、。また、viewDidLayoutSubviewsも呼び出すので、そこで追加作業を行うことができます。

関連する問題