UIView Animations 是我们在开发中经常用到的一种动画实现方式,它主要包含四方面的内容:
- BaseAnimation
- Springs
- Transitions
- Keyframe Animations
在正式说UIView Animations之前我们先来了解一个重要的动画属性:UIViewAnimationOptions
UIViewAnimationOptions是iOS4.0及以后出的一个UIViewAnimation属性,用于设置动画的一些定制效果,
其主要包含三个方面的属性设置:
常规动画属性设置:
- .layoutSubviews:动画过程中保证子视图跟随运动
- .allowUserInteraction:动画过程中允许用户交互
- .beginFromCurrentState:所有视图从当前状态开始运行
- .repeat:重复运行动画
- .autoreverse :动画运行到结束点后仍然以动画方式回到初始点。
- .overrideInheritedDuration:忽略嵌套动画时间设置。
- .overrideInheritedCurve:忽略嵌套动画速度设置。
- .allowAnimatedContent:动画过程中重绘视图(注意仅仅适用于转场动画)。
- .showHideTransitionViews:视图切换时直接隐藏旧视图、显示新视图,而不是将旧视图从父视图移除(仅仅适用于转场动画)
- .overrideInheritedOptions :不继承父动画设置或动画类型
-
- .curveLinear: 匀速执行
- .curveEaseIn:
- .curveEaseOut:
- .curveEaseInOut:
转场类型:(仅适用于转场动画设置,可以从中选择一个进行设置,基本动画、关键帧动画不需要设置)
- .transitionNone:没有转场动画效果。
- .transitionFlipFromLeft :从左侧翻转效果。
- .transitionFlipFromRight:从右侧翻转效果。
- .transitionCurlUp:向后翻页的动画过渡效果。
- .transitionCurlDown :向前翻页的动画过渡效果。
- .transitionCrossDissolve:旧视图溶解消失显示下一个新视图的效果。
- .transitionFlipFromTop :从上方翻转效果。
- .transitionFlipFromBottom:从底部翻转效果。
baseAnimation主要完成一些简单的动画效果,如位置平移,透明度变化等,例如:
UIView.animate(withDuration: 0.5) {
}
UIView.animate(withDuration: 0.5, delay: 0.3, options: [],
animations: {
},
completion: nil
)
UIView.animate(withDuration: 0.5, delay: 0.3, options: [],
animations: {
},
completion: nil
)
-
- withDuration: 动画时间
- delay: 动画开始前的等待时间
- options: UIViewAnimationOptions类型的动画细节相关定制
- animations: 动画的闭包
- completion: 动画完成后的操作
springs 主要是实现弹簧效果,主要用到的方法是:
UIView.animate(withDuration: 0.5, delay: 0.5,
usingSpringWithDamping: 0.0, initialSpringVelocity: 0.0, options: [],
animations: {
//
}, completion: nil)
- withDuration: 动画时间
- delay: 动画开始前的等待时间
- usingSpringWithDamping: 阻尼常数,范围为0.0-1.0,数值越小,表示阻力越小,即停下来需要的时间越久
- initialSpringVelocity: 动力指数,动力越大,初始速度越大
- options: UIViewAnimationOptions类型的动画细节相关定制
- animations:动画处理
- completion:动画完成后的操作
主要用于一些过渡动画的开发,其主要包含的方法如下:
UIView.transition(with: animationContainerView,
options: [.curveEaseOut, .transitionFlipFromBottom],
UIView.transition(from: oldView, to: newView, duration: 0.33,
options: .transitionFlipFromTop, completion: nil)
有些时候可能会遇到制作复杂、具有连贯性UIView动画的需求,这时如果使用在completion闭包中衔接一段一段的动画,使之成为一段连续的动画,如果只是连接2个,或者3个动画,这种方式或许还行得通,但如果有更多的动画片段需要连接的时候,这种方式就会有很大的问题,代码会非常的冗余,不断的在completion闭包中嵌套代码。
这时最好的办法就是使用Keyframe Animations。Keyframe Animations可以让我们有效的拆分由若干段动画连接而成的复杂动画,可以较为精准的定义每段动画的起始点及持续时间,并且在代码组织方面也非常清晰。
Keyframe Animations的一般使用:
UIView.animateKeyframes(withDuration: duration, delay: delay,
animations: {
//add keyframes
UIView.addKeyframe(withRelativeStartTime: time1, relativeDuration: duration1,
animations: {
}
)
UIView.addKeyframe(withRelativeStartTime: time2, relativeDuration: duration2) {
}
UIView.addKeyframe(withRelativeStartTime: time3, relativeDuration: duration3) {
}
},
completion: nil
)