自定义UIView
的 subview 的 subview 的边界在layoutSubviews()
中似乎为0,因此在layoutSubviews()
中使用边界是一个问题。
为了显示问题,我在GitHub上放置了一个演示:SOBoundsAreZero
这是自定义 View 实现的直接链接:DemoView.swift
自定义 View “DemoView”的结构如下:
DemoView
firstLevelSubview
secondLevelSubview
正在使用“自动布局”以编程方式创建此结构。
调用
layoutSubviews()
时, View 和firstLevelSubview具有预期的范围,但是secondLevelSubview的范围为0。我希望至少在上次调用
layoutSubviews
时,所有使用“自动布局”的 subview 都具有正确的边界。该结构是真实案例的抽象。为了避免该问题,可以将secondLevelSubview作为第一级 subview 添加到DemoView。尽管这是事实,但在实际情况下是不可行的。
我觉得我在这里遗漏了一些简单的东西,即使这是预期的行为。
最佳答案
我可以通过调用secondLevelSubview.layoutIfNeeded()
中的layoutSubviews()
来解决此问题。
override func layoutSubviews() {
super.layoutSubviews()
secondLevelSubview.layoutIfNeeded()
firstLevelSubview.layer.cornerRadius = bounds.width / 2
secondLevelSubview.layer.cornerRadius = secondLevelSubview.bounds.width / 2
print("bounds.width: \(bounds.width), contentView.bounds.width: \(firstLevelSubview.bounds.width), backgroundView.bounds.width: \(secondLevelSubview.bounds.width)")
}
layoutIfNeeded()
的描述为:因此,基本上,您在这里有订购问题。该 subview 已安排好布局,并且“自动布局”将到达该 subview ,但尚未完成。通过调用
layoutIfNeeded()
,您可以告诉“自动布局”立即执行挂起的布局,以便获取更新的框架信息。注意:您也可以只调用
self.layoutIfNeeded()
,这将布局DemoView
及其所有 subview 。如果您有许多这样的 subview 并且不想在每个 subview 上调用layoutIfNeeded()
,这将很有用。关于ios - 在layoutSubviews()中, subview 的边界为零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56901204/