Swift 5 UIKit自动布局约束设置后打印属性值异常问题求助
问题原因解答
核心原因:Auto Layout 约束的计算时机晚于你的打印时机
UIKit 的约束计算是批量异步执行的,不是每添加一条约束就立刻更新视图的 frame 数值,你当前的打印逻辑放在 viewDidLoad 生命周期中,此时约束还没有被布局引擎解析计算,所以你拿到的是 UIImageView 初始化时的默认 frame。
问题1解答
你初始化 UIImageView 时传入了图片,所以它的默认 frame 和你传入的 grid 图片尺寸完全一致,你打印出的 gb center X 375.0 就是图片本身的尺寸对应的数值,和你设置的约束无关。
约束设置完成后,UIKit 会在后续的布局周期(viewWillLayoutSubviews、viewDidLayoutSubviews)中统一计算所有约束,更新子视图的 frame,所以最终渲染到模拟器上的布局是符合预期的。
问题2解答
和上面的原因一致,你打印宽度时,布局引擎还没有执行你设置的宽度约束计算,所以拿到的还是图片本身的宽度。
验证方法
你可以通过两种方式拿到正确的布局数值:
- 把打印逻辑移到
viewDidLayoutSubviews方法中,这个生命周期回调触发时,所有约束已经计算完成,视图的 frame 已经更新:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() print("gb center X", self.gameView.gameBoard.center.x) print("gb width bounds", self.gameView.gameBoard.bounds.size.width) }
- 在所有约束设置完成后,手动触发立即布局:
// 所有约束设置完成后调用 self.view.layoutIfNeeded() // 此时再打印就会得到符合约束的数值 print("gb center X", self.gameView.gameBoard.center.x)
内容的提问来源于stack exchange,提问作者SanMu
相关产品推荐
相关产品推荐

