Swift - intrinsicContentSize 未按时调用
Swift - intrinsicContentSize is not called on time
我的界面生成器中有以下结构:
MyCustomView
StackView
Label
TextField
Label - is hidden
Button
按下按钮时,CustomView 的逻辑应该使底部标签出现,因此再次计算 IntrinsicContentSize。不幸的是,只有在单击第二个按钮后才能正确显示视图。
相关代码如下:
public class MyCustomView: UIView {
...
var subtitle: String! {
didSet {
subtitleLabel.isHidden = subtitle.isEmpty
subtitleLabel.text = subtitle
invalidateIntrinsicContentSize()
}
}
....
override public var intrinsicContentSize: CGSize {
stackView.layoutIfNeeded()
return stackView.bounds.size
}
....
}
当取消隐藏其中一个 stackView 子视图时,我缺少的行是 stackView.setNeedsLayout()
。
所以这是工作 didSet
:
var subtitle: String! {
didSet {
subtitleLabel.isHidden = subtitle.isEmpty
subtitleLabel.text = subtitle
stackView.setNeedsLayout()
invalidateIntrinsicContentSize()
}
}
我的界面生成器中有以下结构:
MyCustomView
StackView
Label
TextField
Label - is hidden
Button
按下按钮时,CustomView 的逻辑应该使底部标签出现,因此再次计算 IntrinsicContentSize。不幸的是,只有在单击第二个按钮后才能正确显示视图。
相关代码如下:
public class MyCustomView: UIView {
...
var subtitle: String! {
didSet {
subtitleLabel.isHidden = subtitle.isEmpty
subtitleLabel.text = subtitle
invalidateIntrinsicContentSize()
}
}
....
override public var intrinsicContentSize: CGSize {
stackView.layoutIfNeeded()
return stackView.bounds.size
}
....
}
当取消隐藏其中一个 stackView 子视图时,我缺少的行是 stackView.setNeedsLayout()
。
所以这是工作 didSet
:
var subtitle: String! {
didSet {
subtitleLabel.isHidden = subtitle.isEmpty
subtitleLabel.text = subtitle
stackView.setNeedsLayout()
invalidateIntrinsicContentSize()
}
}