UIView - 啥覆盖将允许更新 UIView 框架
Posted
技术标签:
【中文标题】UIView - 啥覆盖将允许更新 UIView 框架【英文标题】:UIView - What override will allow updating a UIView frameUIView - 什么覆盖将允许更新 UIView 框架 【发布时间】: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() 中尝试过,但都没有成功。 【参考方案1】:在 UIViewController 中拥有视图,在控制器的 viewDidLayoutSubviews() 中调用一个调整视图大小的函数
override func viewDidLayoutSubviews()
myView.resize()
【讨论】:
我有一个自定义的警报视图,所以我不能随处添加这段代码,它会破坏一切。我的意思是,我在 45 个不同的地方使用了这段代码。我需要避免在任何地方添加特殊的条件代码来调整视图的大小,尤其是当视图/视图只会非常有条件地存在时。 如果您将 AlertViewController 子类化,则还有 viewDidLayoutSubviews 将被覆盖。 我没有继承 AlertViewController,我只是创建了一个自定义 UIView XIB以上是关于UIView - 啥覆盖将允许更新 UIView 框架的主要内容,如果未能解决你的问题,请参考以下文章
将 UIView 覆盖添加到 UIIMagePickerController 视频录制
使用后将覆盖 UIView 的触摸事件转发到下面的 UIScrollView