带有约束的 UIViewAnimation 在 Swift 中不起作用
Posted
技术标签:
【中文标题】带有约束的 UIViewAnimation 在 Swift 中不起作用【英文标题】:UIViewAnimation with constraint not working in Swift 【发布时间】:2018-07-28 11:55:00 【问题描述】:我正在尝试创建一个动画,我想在父 UIViewController 加载后从右向左滑动 uiview,尽管我能够显示视图但动画不起作用。我的动画代码:
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
view.isOpaque = false
UIView.animate(withDuration: 1.0, delay: 1.0, options: .curveEaseOut, animations:
self.contentXConstraint.constant = 500
self.contentXConstraint.constant = 80
) (status) in
我已将父视图控制器显示为呈现的视图控制器:
present(navController, animated: false, completion: nil)
【问题讨论】:
【参考方案1】:你忘了self.view.layoutIfNeeded()
self.contentXConstraint.constant = 500
self.contentXConstraint.constant = 80
UIView.animate(withDuration: 1.0, delay: 1.0, options: .curveEaseOut, animations:
self.view.layoutIfNeeded()
) (status) in
来自https://developer.apple.com/documentation/uikit/uiview/1622507-layoutifneeded
使用此方法强制视图立即更新其布局。使用 Auto Layout 时,布局引擎会根据需要更新视图的位置以满足约束的变化
【讨论】:
@pankaj 乐于助人:)【参考方案2】:将动画代码从 viewDidAppear 移动到 viewDidLayoutSubviews
【讨论】:
【参考方案3】:更新约束后需要添加layoutIfNeeded()
方法
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
view.isOpaque = false
UIView.animate(withDuration: 1.0, delay: 1.0, options: .curveEaseOut, animations:
self.contentXConstraint.constant = 500
self.contentXConstraint.constant = 80
self.view.layoutIfNeeded()
) (status) in
【讨论】:
以上是关于带有约束的 UIViewAnimation 在 Swift 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
UiViewAnimation 不调用 setAnimationDidStopSelector
UIViewAnimation 由属于 UINavigationController 的 UIViewController 完成?