-
过渡动画
1、公开动画效果:
kCATransitionFade:翻页
kCATransitionMoveIn:弹出
kCATransitionPush:推出
kCATransitionReveal:移除
2、非公开动画效果:
"cube":立方体
"suckEffect":吸收
"oglFlip":翻转
"rippleEffect":波纹
"pageCurl":卷页
"cameraIrisHollowOpen":镜头开
"cameraIrisHollowClose":镜头关
3、动画方向类型:
kCATransitionFromRight:从右侧开始实现过渡动画
kCATransitionFromLeft:从左侧开始实现过渡动画
kCATransitionFromTop:从顶部开始实现过渡动画
kCATransitionFromBottom:从底部开始实现过渡动画
let transition = CATransition.init()
transition.duration = 3.0
transition.type = .push //推送类型
transition.subtype = .fromLeft //从左侧
view.exchangeSubview(at: 1, withSubviewAt: 0)
view.layer.add(transition, forKey: nil)
-
UIView动画
UIView.animate(withDuration: 2.0, delay: 0.0, options: [.repeat]) {
print("重复执行动画")
}
通过transform属性实现动画
private lazy var redView: UIView = {
let view = UIView.init(frame: CGRect.init(x: 200.0, y: 200.0, width: 60.0, height: 60.0))
view.backgroundColor = .red
return view
}()
// 旋转
UIView.animate(withDuration: 2.0, delay: 5.0, options: [.repeat]) { [weak self] in
self?.redView.transform = CGAffineTransform.init(rotationAngle: Double.pi / 2.0)
}
-
基础动画(CABasicAnimation)
1、CABasicAnimation类只有三个属性:
fromValue:开始值
toValue:结束值
Duration:动画的时间
2、通过animationWithKeyPath键值对的方式设置不同的动画效果
transform.scale
transform.scale.x
transform.scale.y
transform.rotation.z
opacity
margin
zPosition
backgroundColor
cornerRadius
borderWidth
bounds
contents
contentsRect
cornerRadius
frame
hidden
mask
masksToBounds
opacity
position
shadowColor
shadowOffset
shadowOpacity
shadowRadius
// 逐渐变透明
let animation = CABasicAnimation(keyPath: "opacity") // 这个key指定执行什么动画
animation.fromValue = 1.0
animation.toValue = 0.0
animation.duration = 3.0
redView.layer.add(animation, forKey: "Image-opacity") // 这个key是用来标记动画层的
redView.alpha = 0.0 // 不加这句,动画执行结束后会回到动画前的状态
-
关键帧动画(CAKeyframeAnimation)
CAKeyframeAnimation可以实现关键帧动画,这个类可以实现某一属性按照一串数值进行动画,就像是一帧一帧的制作出来一样
let animation = CAKeyframeAnimation.init(keyPath: "position") // 这个key指定执行什么动画
//设置5个位置点
let p1 = CGPoint.init(x: 0.0, y: 0.0)
let p2 = CGPoint.init(x: 300.0, y: 0.0)
let p3 = CGPoint.init(x: 0.0, y: 400.0)
let p4 = CGPoint.init(x: 300.0, y: 400.0)
let p5 = CGPoint.init(x: 150.0, y: 200.0)
//赋值
animation.values = [p1, p2, p3, p4, p5]
//每个动作的时间百分比
animation.keyTimes = [NSNumber(value: 0.0),
NSNumber(value: 0.4),
NSNumber(value: 0.6),
NSNumber(value: 0.8),
NSNumber(value: 1.0), ]
animation.delegate = self
animation.duration = 6.0
animation.isRemovedOnCompletion = false // 是否在动画结束后移除动画
animation.fillMode = .forwards // 动画填充模式,.forwards配合isRemovedOnCompletion,不让动画结束后回到初始状态
redView.layer.add(animation, forKey: "Image-Move") // 这个key是用来标记动画层的
extension Test: CAAnimationDelegate {
func animationDidStart(_ anim: CAAnimation) {
print("动画开始")
}
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
print("动画结束")
}
}
参考文章:Swift - 使用CATransition制作过渡动画(页面切换转场效果)
Swift - 通过设置视图的transform属性实现动画
Swift - 使用CABasicAnimation实现动画效果
Swift - 使用CAKeyframeAnimation实现关键帧动画
Swift - 沿路径运动的动画实现(圆形、曲线、直线等路径轨迹)