从 Nib 加载的 UIView,手动调用 autolayout

Posted

技术标签:

【中文标题】从 Nib 加载的 UIView,手动调用 autolayout【英文标题】:UIView loaded from the Nib, manually calling autolayout 【发布时间】:2015-02-20 14:45:58 【问题描述】:

我需要从 Nib 加载 UIView 并将其呈现为 PDF(它是发票)。所以我从 Nib 加载自定义 UIView invoiceView 并进行设置(在其中设置各种标签)。

设置标签后,我必须强制视图自行布局,以便各种 UI 元素正确调整大小/重新定位。

调用:

invoiceView.updateConstraints()

什么都不做。

调用:

invoiceView.layoutSubviews()

把一切都搞砸了。

这是我已经尝试过的:

    invoiceView 的设置框架(没有任何作用)。

    设置框架并将invoiceView 添加到当前视图层次结构中:

    self.view.addSubview(invoiceView)

正确设置一切。但是我不想这样做。我想强制视图正确布局(使用布局约束)。我究竟做错了什么?我应该在invoiceView 上调用哪些方法,以便在不将其添加到当前视图层次结构的情况下正确布局?

PS:代码是从内存中输入的。请忽略错别字。

【问题讨论】:

如果您使用自动布局工作,请忘记设置框架。要强制自动布局引擎计算帧,您应该首先标记为需要布局,然后按照 kedzia 所写的那样调用 layoutIfNeeded 我已经说过设置框架没有任何作用。我在这里提到它是为了避免一个班轮提出这样的建议。 【参考方案1】:

试试

invoiceView.setNeedsLayout()
invoiceView.layoutIfNeeded()

【讨论】:

上面的代码只会在后台调用layoutSubviews。就像我上面说的,layoutSubviews 完全搞砸了一切。我认为这是一个框架/边界问题。不过谢谢。 @User123 如果它弄乱了您的代码,则意味着您要应用于视图的布局可能不正确。如果您在视图中看到 ok 但在渲染 PDF 中看不到,情况就不同了 布局正确。如果它不正确,即使它是活动层次结构的一部分,它也会被搞砸。

以上是关于从 Nib 加载的 UIView,手动调用 autolayout的主要内容,如果未能解决你的问题,请参考以下文章

调用 UIView initWithFrame 即使从 NIB 加载 self ? [复制]

从 NIB 加载十几个相同类型的 UIView

从 nib 文件加载 UIView?

从 NIB 加载 UIView - 帧大小错误

UIView 在加载 NIB 文件后立即显示?

从 nib 加载自定义 UIView 会导致无限循环或抛出 nil 异常