UIVisualEffectViewにサブビューとして追加したい小さな情報ビューを作成しました。私の情報ビューでは、フリーフォームのxibを作成し、すべてのUILabelsと1つのUIButtonにAuto Layoutを使用しました。ここでの目標は、スタート、プルとスレートはすべてオプションです。そのデータが存在しない場合は、それらのUILabelsを折りたたみたいと思います。私は物事がきちんとしてドンいるので、これらのオプションのUIlabels崩壊の一部またはすべてが、私はUIView
のフレームの高さを更新したいときは0です。自動レイアウト定数を変更してもフレームが更新されない
私の問題に自分の等しい高さ制約を更新することによって、これを達成しました潜在的にギャップがある。
私は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
はうまく整列され、UIView
はUIButton
の下にぴったりと引き上げられます!
いずれの方向にも大変感謝しています。私はこの2日間行ってきました。ありがとう!
UPDATE:
self.view.layoutIfNeeded()
は確かに勝者でした!私の場合、タイミングはすべてでした。
私はその細心の注意を払ったことはありませんが、以下はlayoutIfNeeded()
が即時であるところのOSへの「示唆」のようです。
self.view.setNeedsUpdateConstraints()
self.view.setNeedsLayout()
self.view.setNeedsDisplay()
'view.setNeedsUpdateConstraints()を呼び出すと、すぐにレイアウトが行われることはありません。そのために 'view.layoutIfNeeded()'を呼び出します。 – dan