自定义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/

10-10 20:55