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

将 UIImageView 和覆盖的 UIView 保存为图像(xcode/iOS)

通过滑动 UIView 滑出导航以覆盖另一个 UIView

如何快速覆盖 UIView.pointInside?

UIView 内容模式在覆盖 drawRect 时表现不同: