在我的设计示例中,我有以下单一视图:
如您所见,它包含一些简单的约束:
-
对齐水平和垂直中心,
-
高度(设为常数)
-
前导和尾随空格(设置为常量)
我想要达到的目的是从顶部看到这个红色/粉红色的视图"come in" . 传统上,在一个无约束的世界中,我只是修改 UIView.animateWithDuration
中的框架,但是我不确定我是如何在约束世界中做类似的 .
To reiterate my question, how can I make my view start out of scene and animate the view flying in from the top?
我已经考虑过制作垂直中心约束的动画(并随后调用 layoutIfNeeded
),但它没有达到预期的效果 .
谢谢你的帮助 .
5 回答
您可以做的是在
viewDidAppear
方法中添加以下代码 . 首先,为视图的中心Y约束创建IBOutlet
属性,然后更改其常量值 .你想要的实际上相当简单,我将详细说明如何在不搞乱优先级或时髦常数的情况下完成它 . 通过这种方式,我们可以获得适用于任何屏幕尺寸的动画 .
TL; DR是您需要配置约束,然后在动画块内调用layoutIfNeeded来为更改设置动画 . 更多see this SO post .
因此,我们需要两组约束来隐藏和显示视图 . 在
viewDidLoad
中,视图将被隐藏,然后在viewDidAppear
或我们希望该视图滑入的任何位置 .故事板/ XIB设置
所以首先要配置不会在IB(或代码中,无论你习惯哪种)中改变的约束 . 即;红色视图的高度,以及它到容器的前导和尾随空间 . 所以你的约束可能看起来像这样( note: 我没有设置宽度约束,但让前导空格和尾随空格定义宽度):
现在您将看到IB将警告您没有为视图的Y位置配置约束(因此红色虚线)
您现在可以将顶部空间添加到容器约束并将其设置为占位符约束(复选框显示“在构建时删除”) . 我们这样做是因为我们想以编程方式控制视图的位置 .
这意味着一旦加载视图就不会存在此约束,但是当您告诉IB您知道如何在加载视图时处理此约束时,该约束将用于删除所有警告 .
编码时间
现在我们需要一种隐藏视图的方法,一种显示视图的方法 . 为此,我们将在视图上存储Y定位约束,然后为其设置动画 . 我们的viewController看起来像这样:
隐藏
我们隐藏视图的方法可以简单地删除位置约束,然后添加一个红色视图底部等于视图控制器的视图顶部:
显示
同样,我们的show约束会将视图的中心Y移动到控制器中心Y:
便利方法
为了完整起见,我使用的便捷方法如下所示:
您还可以使用一些CGRect数学检查红色视图是否可见:
试试这个:
请注意约束中的
firstItem
和secondItem
顺序 . 上面的代码假设Superview是firstItem
:替代方法是定义 two 约束:
Center Y Alignment constraint (Superview.CenterY == View.CenterY)优先级= 750
Vertical Space Constraint (SuperView.Top == View.Bottom)优先级= 500
并调整 priority 以确定应采用哪种约束 .
对于任何寻找像请求这样的简单动画的人:
使用这些行,您可以在UIView上添加所需的约束并将其放在何处你需要在ViewController中 .
对我来说,动画的最佳方式 Swift 3 & 4