And*_*rea 3 macos cocoa ios autolayout
有一件事让我对自动布局感到疯狂,我正在进行测试,并发现如果你继承UIView并且你用一些约束放置一些视图就不可能知道计算值.
不要说我们有一个继承的TestViewClass UIView,我们内部有一些子视图.我们想将它用于iPhone和iPad,所以我们使用两种尺寸,假设100x100和200x200我们制约了一切,使一切正常.我们构建此视图将这些子视图放在某些位置.
现在我们需要构建另一个子视图,其中包含许多按钮作为子视图(contentView),这些按钮在运行时给出.
算法将选择此内容视图的大小,并按正确数量的按钮计算它们之间的空间,使得它们彼此之间的距离相同但覆盖整个内容视图宽度.例如,contentView的宽度为200磅,按钮为3,边长为60.它们一起覆盖180,因此我们剩下20个点,应该作为按钮之间的空间 - > 10个点.
这很简单,在自动布局之前已经成千上万次.要做到这一点,我需要contentView的宽度,它的超级视图有一些限制,使其根据超视图大小调整其宽度,问题是我找不到UIView实现中的任何地方,我可以得到最终值contentView的大小.
我试过看-layoutSubviews,-updateConstraints,-didMoveToSuperview,值显示时总是有原来的一个.计算新帧时?
我显然没有得到关于自动布局的东西......
我发现这个问题试图设置表视图单元格高度,试图使它们在表格视图的大小独立显示在屏幕上.这是相关问题的其他问题
最后,我得到了关于自动布局的遗漏,这是一个基本概念.
Autolayout不像自动调整掩码那样工作,新帧不会立即更新,而是根据请求更新.
这有很大的不同,它似乎与CATransaction渲染周期同步,这是有道理的,因为布局计算可能是一项昂贵的任务,并且在您真正需要它之前无法做到,大部分时间在渲染过程中.
当然,除此之外几乎没有例外,我们如何强制自动布局进行此计算?我们可以做设定-setNeedsLayout方法和-layoutIfNeeded.第一种方法将视图标记为"脏",第二种方法强制立即布局.如果在-didMoveToSuperview获得正确的更新帧后立即调用这两种方法.
希望这有帮助,安德里亚
| 归档时间: |
|
| 查看次数: |
4249 次 |
| 最近记录: |