为何Auto Layout下stack view执行动画时起始位置错误?
问题原因
- 你将
isHidden属性的修改放在了动画闭包内,该属性变更本身不会主动触发Auto Layout重计算,且UIStackView对子视图显隐状态变更的布局适配,需要主动触发布局更新才能同步到约束层面 - 动画闭包内仅修改了目标视图的transform和alpha,没有触发栈视图父层级的布局刷新,导致右侧约束在动画初始阶段未被正确计算生效
修复方案
将isHidden的修改提前到动画闭包外,主动触发布局刷新让约束变更适配动画周期,修改后的代码示例如下:
// 动画执行前先修改视图显隐状态 someView.isHidden = false // 预先提交一次布局,确认初始约束状态正确 view.layoutIfNeeded() UIView.animate(withDuration: 0.125, delay: animationDelay, options: [.curveEaseOut], animations: { someView.transform = CGAffineTransform.identity someView.alpha = 1 // 动画闭包内触发布局刷新,让约束调整过程跟随动画执行 view.layoutIfNeeded() }, completion: nil)
额外注意项
- 请确认你的栈视图的leading、trailing约束是直接添加到它的直接父视图上,优先级确实为1000且没有其他同优先级的水平约束冲突
- 若修改后仍存在布局异常,可查看Xcode控制台是否输出约束冲突警告,排查是否有其他隐含的水平方向约束和你设置的leading、trailing约束产生冲突
内容的提问来源于stack exchange,提问作者Jason Barker
相关产品推荐
相关产品推荐

