【发布时间】:2019-09-17 17:45:21
【问题描述】:
我有一个 UIView .xib,并且是 UIView 的子类。当我加载 Nib 时,会设置视图的框架并调用 awakeFromNib()。
我有 3 个按钮。当我加载视图时,我为每个按钮传递回调。如果一个或多个回调为 nil,则隐藏按钮并调整视图大小:
let viewSize = 50
var adjustedSize = 0
if (self.option2String == nil){
self.option2View.isHidden = true
adjustedSize -= viewSize
}
if (self.option3String == nil){
self.option3View.isHidden = true
adjustedSize -= viewSize
}
let _size = self.innerView.frame.size
let size = CGSize(width: _size.width, height: _size.height + CGFloat(adjustedSize))
self.innerView.frame = CGRect(origin: self.innerView.frame.origin, size: size)
我已经尝试将此代码放入 awakeFromNib() 和 didMoveToSuperview() 中,但框架不会改变大小。
如果我将最后一行包含在 DispatchQueue.main.async 中,那么它可以工作。但我担心这只是由于时机问题的运气。
这是最佳做法吗?在 UIView 子类中的哪里可以调整视图的大小?
编辑:确认, DispatchQueue.main.async 只是运气。它只在 50% 的时间内有效。
【问题讨论】:
-
设置框架后是否尝试在超级视图上调用layoutIfNeeded()?
-
@ShreeramBhat 是的,刚刚尝试过,但没有成功
-
@ShreeramBhat 在 awakeFromNib() 和 didLayoutSubview() 中尝试过,但都没有成功。