iOS中textFieldDidBeginEditing时约束动画不生效问题咨询
解决UIView动画更新约束无效果的问题
嘿,我来帮你搞定这个动画直接跳转的问题~你当前的代码里有两个关键问题导致动画没生效:
- 你只修改了约束的
constant值,但没有触发系统重新计算布局。UIKit的约束动画依赖于布局更新的时机,光改常量系统不会自动把变化做成动画。 loadViewIfNeeded()完全用错地方啦,这个方法是用来加载视图控制器的view的,和布局动画半毛钱关系都没有,放在动画块里只会浪费性能。
给你修正后的代码,这样就能看到平滑的动画了:
func textFieldDidBeginEditing(_ textField: UITextField) { // 第一步:先在动画块外更新约束常量 self.middleContainerCenterConstrains.constant = -70 // 第二步:在动画块里触发布局更新,让UIKit把布局变化做成动画 UIView.animate(withDuration: 1.5) { self.view.layoutIfNeeded() } }
简单解释下为什么这么改:
- 先在动画块外面修改约束,让系统先记录下约束的变更;
- 然后在动画块内调用
layoutIfNeeded(),这个方法会强制视图根据最新约束重新计算布局,UIKit会自动把这个布局变化的过程包装成动画,这样middle容器就会平滑移动啦。
另外补充个小细节:如果你的middle容器的直接父视图不是控制器的根view,那记得调用父视图的layoutIfNeeded(),而不是self.view的,这样才能精准触发对应层级的布局动画哦~
内容的提问来源于stack exchange,提问作者hadeneh
相关产品推荐
相关产品推荐

