动画

  • 过渡动画

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 - 沿路径运动的动画实现(圆形、曲线、直线等路径轨迹)

你可能感兴趣的:(动画)