带有约束的 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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Autolayout其他用法

UIViewAnimation 立即播放,延迟被忽略

UIViewAnimation动画

UiViewAnimation 不调用 setAnimationDidStopSelector

UIViewAnimation 由属于 UINavigationController 的 UIViewController 完成?

UIViewAnimation 导致从枚举类型隐式转换