更改 NSLayoutConstraint 时的 SWIFT 动画

Posted

技术标签:

【中文标题】更改 NSLayoutConstraint 时的 SWIFT 动画【英文标题】:SWIFT animation while changing NSLayoutConstraint 【发布时间】:2015-11-23 12:09:21 【问题描述】:

这是我的代码:

func scrollViewDidScroll(scrollView: UIScrollView) 
    if mapHeight.constant < 400 
            mapHeight.constant = 400
            tableOfRestaraunts.reloadData()
    


func normalSize() 
    if mapHeight.constant == 400 
            mapHeight.constant = 200
    

当用户滚动 UITableView 时,我的地图会变小,当他触摸任何地方时,它会变成默认大小。

我想添加一些动画(这样看起来更流畅一些)。我已经尝试了一些来自网络的解决方案,但它们没有帮助。有什么建议吗?

【问题讨论】:

像这样检查浮点数是否相等会给你带来不同的结果。我也不清楚为什么你认为你需要重新加载表视图只是因为约束发生了变化——你不应该这样做。 【参考方案1】:

与往常一样,您应该调用layoutIfNeeded 来为布局约束中的更改设置动画。在您的情况下,您应该在包含约束的视图上调用它(这对我来说并不是很明显)。或者在实际动画块中简单的self.view.layoutIfNeeded()

该示例为您制作动画,动画需要@9​​87654323@ 秒才能完成。您可以使用UIView 的动画块的重载来更好地控制动画的细节。

    func scrollViewDidScroll(scrollView: UIScrollView) 
        if mapHeight.constant < 400 
            UIView.animateWithDuration(0.5)  () -> Void in
                mapHeight.constant = 400
                self.view.layoutIfNeeded()

            
            tableOfRestaraunts.reloadData()
        
    

    func normalSize() 
        if mapHeight.constant == 400 
            UIView.animateWithDuration(0.5)  () -> Void in

                mapHeight.constant = 200
                self.view.layoutIfNeeded()
            
        
    

更新:我没有意识到你没有动画块。更新为包含实际的动画块。

【讨论】:

您不需要在动画块中设置constant 属性。那应该发生在以前。另外,请注意缩进。 你说的没错,但是为了可见性,还是在动画块里面做比较好,这样大家就清楚了动画块的目的和后果。 Should 这个词对于无论哪种方式都相同的模式来说太强了,你不觉得吗?

以上是关于更改 NSLayoutConstraint 时的 SWIFT 动画的主要内容,如果未能解决你的问题,请参考以下文章

更改 NSLayoutConstraint 的常量

安全地更改 NSLayoutConstraint 常量值

NSLayoutConstraint 更改后,systemLayoutSizeFittingSize 不起作用

如何以编程方式更改或更新 NSLayoutConstraint

我可以更改 NSLayoutConstraint 的乘数属性吗?

NSLayoutConstraint 的 Unsatisfiable Constraint 以编程方式更改 - swift