在 Swift 中,如何使用自动布局为 UIView 设置动画,就像页面滑入一样?

Posted

技术标签:

【中文标题】在 Swift 中,如何使用自动布局为 UIView 设置动画,就像页面滑入一样?【英文标题】:In Swift, how do I animate a UIView with auto-layout like a page sliding in? 【发布时间】:2015-12-21 06:26:02 【问题描述】:

我尝试创建一个 UIView,它代表一个与设备屏幕大小相同的页面。由于该应用程序支持方向,我使用 AutoLayout 来构建它。

在我尝试为页面设置动画以从右侧滑入之前,它工作正常。经过一番研究,这是我能想到的最好的:

myView = UIView()
myView.backgroundColor = UIColor.orangeColor()
parentView.addSubview(myView)

myView.translatesAutoresizingMaskIntoConstraints = false
myView.leftAnchor.constraintEqualToAnchor(parentView.rightAnchor).active = true
myView.widthAnchor.constraintEqualToAnchor(parentView.widthAnchor).active = true
myView.heightAnchor.constraintEqualToAnchor(parentView.heightAnchor).active = true

UIView.animateWithDuration(Double(1.0), animations: 
    self.myView.leftAnchor.constraintEqualToAnchor(self.parentView.leftAnchor).active = true
    self.myView.layoutIfNeeded()
)

使用上面的代码,页面myView从左上角滑入,这不是我所期望的,日志也显示Unable to simultaneously satisfy constraints

非常感谢任何可以帮助我并纠正我以更好地理解 AutoLayout 和动画的建议。谢谢。

【问题讨论】:

你错过了***主播。 @dasdom 即使我添加了顶部锚点,也是一样的。问题是我认为我正在覆盖现有规则,但实际上我正在创建新规则。所以解决方案是在创建新规则之前先停用一些规则。我想我已经找到了解决方案,我稍后会发布答案。 【参考方案1】:

在我最初的问题中,我以为我正在覆盖现有规则(左锚),但实际上我正在为左锚创建一个新规则,因此冲突和动画失败。

在@vacawama in the other question about changing AutoLayout rule 的帮助下,它现在工作如下:

override func viewDidLoad() 
    super.viewDidLoad()

    let myView = UIView()
    myView.backgroundColor = UIColor.orangeColor()
    myView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(myView)

    myView.topAnchor.constraintEqualToAnchor(view.topAnchor).active = true
    myView.widthAnchor.constraintEqualToAnchor(view.widthAnchor).active = true
    myView.heightAnchor.constraintEqualToAnchor(view.heightAnchor).active = true

    var leftConstraint = myView.leftAnchor.constraintEqualToAnchor(view.rightAnchor)
    leftConstraint?.active = true

    myView.layoutIfNeeded()

    /* try to deactivate a rule and create a new rule, then animate it */
    leftConstraint?.active = false
    leftConstraint = myView.leftAnchor.constraintEqualToAnchor(view.leftAnchor)
    leftConstraint?.active = true

    UIView.animateWithDuration(1.0)  self.view.layoutIfNeeded() 

但是,如果我将最后一行更改为在 myView 上调用 layoutIfNeeded(),则它不是动画(欢迎任何评论)。我实际上想在子视图而不是父视图上调用它,因为我不希望所有子视图都进行动画处理(在完整的用例中)。所以它可能需要一些解决方法,但基本概念已经存在并且已经解决了最初的问题。

【讨论】:

以上是关于在 Swift 中,如何使用自动布局为 UIView 设置动画,就像页面滑入一样?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

Swift - 如何对 ScrollView 中的项目使用自动布局?

Swift - UICollectionView:如何在标题中自动布局标签间距

在 Swift 中使用 ScrollView 进行自动布局

ios - 如何使用ios swift中的自动布局以编程方式将两个标签并排放置在中心位置?

uitableviewcell中的swift uitableview,自动布局始终高度为0