【问题标题】: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() 中尝试过,但都没有成功。

标签: ios swift uiview


【解决方案1】:

在 UIViewController 中拥有视图,在控制器的 viewDidLayoutSubviews() 中调用一个调整视图大小的函数

override func viewDidLayoutSubviews() {
   myView.resize()
}

【讨论】:

  • 我有一个自定义的警报视图,所以我不能随处添加这段代码,它会破坏一切。我的意思是,我在 45 个不同的地方使用了这段代码。我需要避免在任何地方添加特殊的条件代码来调整视图的大小,尤其是当视图/视图只会非常有条件地存在时。
  • 如果您将 AlertViewController 子类化,则还有 viewDidLayoutSubviews 将被覆盖。
  • 我没有继承 AlertViewController,我只是创建了一个自定义 UIView XIB
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多