ALAnimatable 将一个 Animatable 协议添加到您的项目中,允许您使用单行代码一次性在视图中动画化所有子视图,前提是您使用 Auto Layout 创建了您的用户界面。
ALAnimatable 需要 iOS 8+,并且与使用 Auto Layout 的 Swift 2 项目兼容。
只需将文件 Animatable.swift 拖入您的项目中即可。这就是您真正需要做的。
animateSubviews 方法完整的签名包括除了必填的 direction 以外的更多选项
func animateSubviews(from direction: AnimatableDirection, destination: AnimatableDestination,
speed: AnimatableSpeed, origin: AnimatableOrigin,
bouncing: Bool, excluding: Set<UIView>,
uniform: AnimatableUniform)
direction: AnimatableDirection 可以是 Right、Left、Top 或 Bottom,并设置子视图动画的起始位置。destination: AnimatableDestination 可以是 In(默认选项)或 Out,表示所有子视图是否应动画进入视图或离开。speed: AnimatableSpeed 可以是 Quick、Medium(默认选项)或 Slow,并设置动画的持续时间。origin: AnimatableOrigin 可以是 Close(默认选项)、Far 或 ReallyFar,指示在动画开始时视图放置得多远(或者如果是 Out 动画,则它们会走多远)。这会对子视图的移动产生一些影响,但不是很明显。bouncing: Bool 显然可以是 true(默认选项)或 false,并设置子视图是否在动画结束时弹跳。excluding: Set<UIView> 预期一个集合(因此您可以传递一个数组),包含所有您不希望动画化的视图的子视图。它的默认值是一个空集,因此所有子视图都会被动画化。uniform: AnimatableUniform 可以是 Slightly、Nearly 或 Totally(默认选项),允许子视图以不同的速度动画。首先,你需要使用自动布局(在ALAnimatable中的AL前缀实际上表示自动布局,而不是Albert)来创建用户界面。你不需要设置任何特殊的约束、优先级或其他设置。只需忘记你将要动画化视图,并按常规设计你的界面。
其次,在你的代码中,你可以在包括所有其他内容的视图中调用那一行代码。这可能是主要的UIViewController的view。
没有其他内容。
从源代码的角度来看,ALAnimatable创建一个Animatable协议,并添加一个扩展,其中包含所有只能由UIView采用的功能。它还设置了另一个扩展来表明UIView实际上采用了Animatable。如果你不希望你的项目中的每个UIView都采用Animatable,你可以删除extension UIView: Animatable { }这一行,然后确保你自己的UIView子类采用了该协议。
所有适用于水平或垂直约束的选项。这包括水平动画的CenterX、CenterXWithinMargins、Leading、LeadingMargin、Left、LeftMargin、Right、RightMargin、Trailing和TrailingMargin,以及垂直动画的Bottom、BottomMargin、CenterY、CenterYWithinMargins、Top和TopMargin。
是的,它可以。如果你使用嵌套的堆叠视图,祝你好运,去清理所有来自Interface Builder的警告。
动画主UIViewController的view中的所有子视图(除底部的按钮外)从右侧来
view.animateSubviews(from: .Right, excluding: [buttons])
动画主UIViewController的view中的所有子视图(除底部的按钮外)从左侧来,缓慢地移出屏幕但移动得很远
view.animateSubviews(from: .Left, destination: .Out, speed: .Slow, origin: .Far, excluding: [buttons])
动画主UIViewController的view中的所有子视图(除底部的按钮外)从顶部来,确实非常远(因此它们将突然出现)
view.animateSubviews(from: .Top, origin: .ReallyFar, excluding: [buttons])
动画主UIViewController的view中的所有子视图(除底部的按钮外)从底部来,不带有最后的弹跳动作
view.animateSubviews(from: .Bottom, bouncing: false, excluding: [buttons])
动画主UIViewController的view中的所有子视图(除底部的按钮外)从右侧来,并设置uniform以使每个子视图以不同的速度动画化
view.animateSubviews(from: .Right, excluding: [buttons], uniform: .Slightly)
如预期,为了保证ALAnimatable可靠地工作,自动布局系统必须是有效的。
excluding参数允许您设置某些子视图,只要它们是通过涉及主视图或其他也排除在动画过程之外的子视图的限制放置的,就无需进行动画处理。如果您在excluding中传递了一个子视图,但其位置是由将参与到动画过程中的其他子视图涉及的限制设置的,则该子视图也会被动画处理。
Albert Mata
ALAnimatable使用MIT许可。如果您有任何问题,或者想要分享您如何使用这个工具,请提交一个问题。