gpt4 book ai didi

ios - 自动布局如何从 View 中获取计算值

转载 作者:可可西里 更新时间:2023-11-01 06:20:53 25 4
gpt4 key购买 nike

有一件事真的让我对自动布局着迷,我正在做我的测试,发现如果你子类化一个 UIView 并且你把一些 View 和它们的约束放在一起是不可能知道计算值的。
假设我们有一个继承自 UIView 的 TestViewClass,我们在里面有一些 subview 。我们想将它用于 iPhone 和 iPad,所以我们使用两种尺寸,假设 100x100 和 200x200 我们设置了约束条件以使一切正常。我们构建这个 View ,将这些 subview 放在某些位置。
现在我们需要构建另一个 subview ,其中包含许多按钮作为 subview (contentView),其数量在运行时给出。
该算法将选择此内容 View 的大小,并放置正确数量的按钮,计算它们之间的空间,使彼此之间的距离相同,但覆盖整个内容 View 宽度。例如,contentView 的宽度为 200 点,按钮为 3,边长为 60 的正方形。它们一起覆盖 180,因此我们还剩下 20 点应该作为按钮之间的空间 -> 10 点。
这很简单,在自动布局之前制作了数千次。为此,我需要 contentView 的宽度,它对其 superview 有一些限制,使其根据 superview 大小调整其宽度,问题是我无法在 UIView 实现中找到任何可以获取最终值的地方contentView 的大小。
我试过view -layoutSubviews, -updateConstraints, -didMoveToSuperview, value show都是原来的。什么时候计算新帧?
我显然对自动布局一窍不通……



我在尝试设置表格 View 单元格高度时发现了这个问题,试图让它们根据表格 View 的大小独立地显示在屏幕上。这是相关问题 other question

最佳答案

我终于明白了我在自动布局方面所遗漏的东西,这是一个基本概念。

Autolayout doesn't work like autoresizing masks, the new frames aren't updated instantaneously but by request.

这有很大的不同,它似乎与 CATransaction 渲染周期同步,这是有道理的,因为布局计算可能是一项昂贵的任务,并且在您真正需要它之前是无用的,大部分时间在渲染期间.
当然也有少数异常(exception),比如这个,我们如何强制自动布局进行此计算?我们可以设置-setNeedsLayout方法和-layoutIfNeeded。第一种方法将 View 标记为“脏”,第二种方法强制立即布局。如果您在获得正确的更新帧后立即在 -didMoveToSuperview 中设置调用这两个方法。
希望对您有所帮助,安德里亚

关于ios - 自动布局如何从 View 中获取计算值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17152168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com