约束动画仅可上移无法下移,Auto Layout按钮触发动画异常求助
这种Auto Layout动画的坑我之前踩过好几次,尤其是方向不对的问题,咱们一步步捋清楚解决办法:
先确认约束修改的对象和值是否正确
很多时候动画无效都是改错了约束!比如向上动画如果是调整了topAnchor的约束值,那向下动画得对应修改bottomAnchor或者centerYAnchor的约束,而不是还盯着top约束改。举个例子:如果你的视图有一个绑定到父视图顶部的topConstraint,向上动画是把topConstraint.constant设为0,那向下动画应该去修改bottomConstraint.constant为0(前提是你给视图加了bottom约束),或者调整centerYAnchor的constant让视图下移到屏幕底部。严格遵循Auto Layout动画的标准流程
Auto Layout动画的核心逻辑不能错:先修改约束的constant值,然后在UIView.animate代码块里调用父视图的layoutIfNeeded(),而不是只调用目标视图的。比如正确的写法应该是这样:@IBAction func downButtonTapped(_ sender: UIButton) { // 先修改对应约束的constant值,比如让视图底部贴紧父视图底部 bottomConstraint.constant = 0 // 在动画块内触发父视图的布局刷新 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() // 这里一定要用父视图! } }之前碰到好多人只调用目标视图的
layoutIfNeeded(),这会导致布局引擎没正确计算整个父视图的布局,自然就看不到动画效果。排查约束冲突和优先级问题
打开Xcode的Debug View Hierarchy看看,是不是有高优先级的约束把视图“钉”住了?比如你给top约束设了.required的优先级,同时又想修改bottom约束,布局引擎会优先满足高优先级的top约束,导致bottom的修改完全没作用。如果有冲突,要么调整约束的优先级,要么删掉多余的约束。检查锚点(Anchor)的设置
如果你手动修改过视图的layer.anchorPoint,这会改变视图的布局原点,导致约束constant的偏移量和你预期的不一样。比如默认锚点是(0.5,0.5),要是改成了(0,0),那修改约束时的位移计算就乱了。可以先把锚点改回默认值测试一下,排除这个因素的影响。确认动画的执行时机
如果在视图还没完成初始布局的时候触发动画(比如在viewDidLoad里直接调用),也会导致动画无效。可以把动画触发逻辑放到viewDidAppear之后,或者在调用动画前先手动调用一次view.layoutIfNeeded(),确保视图已经完成了一次布局。
按照上面的步骤排查下来,应该就能解决向下动画无效的问题了。
内容的提问来源于stack exchange,提问作者MT1asli8ghwoi

