添加约束后UIView动画失效,TextField隐藏后立即复位求解决
为什么添加约束后动画会复位?
直接修改textField.center这类frame相关属性,本质是绕开了Auto Layout的约束规则。动画执行时视图会暂时移动,但动画结束后,系统的布局引擎会重新应用你给TextField设置的约束,强制把视图拉回约束指定的位置,所以会出现“短暂隐藏后立即复位”的现象。
另一个项目能正常运行的原因
你提到的同类项目,是通过修改约束的constant值来实现动画,而非直接修改frame/center。从代码和Storyboard截图来看,那个项目给TextField的位置约束(比如leading、trailing或者水平偏移约束)创建了IBOutlet,动画时修改约束的constant,再触发布局更新,让Auto Layout参与到动画流程中,这样就不会出现复位问题。
正确的实现步骤
给TextField的位置约束创建IBOutlet
在Storyboard里给TextField添加一个位置约束(比如距离父视图左侧的leading约束),然后把这个约束关联到代码里,命名为textFieldLeadingConstraint。初始状态隐藏TextField
在viewDidLoad里修改约束的constant,让TextField移出屏幕外,然后立即更新布局:override func viewDidLoad() { super.viewDidLoad() // 初始时把TextField移到屏幕左侧外部 textFieldLeadingConstraint.constant = -view.frame.width view.layoutIfNeeded() }点击按钮执行显示动画
修改约束的constant为正常显示的数值,然后在动画块里调用layoutIfNeeded(),让Auto Layout平滑更新布局:@IBAction func showTextFieldTapped(_ sender: UIButton) { textFieldLeadingConstraint.constant = 0 // 恢复到正常位置的约束值 UIView.animate(withDuration: 0.5, options: .curveEaseIn) { self.view.layoutIfNeeded() } }
如果你的TextField是从右侧移入,只需要把初始的constant设为view.frame.width,动画时改回0即可。
内容的提问来源于stack exchange,提问作者Fiesta

