执行setNeedsLayout与layoutIfNeeded后,是否总能获取准确的View Frame?
回答
这个观点错误,核心逻辑在于:
layoutIfNeeded是同步执行的布局计算操作:它会立刻完成视图树的约束解析、frame更新整个流程,这个过程在当前代码执行的RunLoop周期内同步完成,不存在异步等待。- 你混淆了「布局计算」和「屏幕渲染」的概念:屏幕渲染(将布局好的视图绘制到屏幕)确实是异步的,但
frame的值是在布局计算阶段就已经确定并更新的,和后续的渲染步骤无关。
所以在你的代码中,layoutIfNeeded执行完成后,myView.frame已经是更新后的正确值,此时打印的结果一定是准确的。
补充说明:
setNeedsLayout只是标记视图需要布局,等待RunLoop自动触发异步布局;而layoutIfNeeded会跳过等待,立即同步完成所有待处理的布局工作。- 你的场景里,子视图约束修改后,
setNeedsLayout标记myView为dirty,layoutIfNeeded立刻完成布局计算,frame已更新,打印结果完全可信。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

