CAAnimationGroup 动画组
CAAnimationGroup 用于一组动画
直接上代码
//
// ViewController.swift
// AnimationGroup
//
// Created by 鲍东升 on 16/5/20.
// Copyright © 2016年 鲍东升. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
//MARK: - PropertyList
var cardView1 : UIView?
var cardView2 : UIView?
private lazy var show2FrontAnimationGroup:CAAnimationGroup={
var val=CAAnimationGroup()
val.animations = []
return val
}()
private lazy var hide2BackAnimationGroup:CAAnimationGroup={
var val=CAAnimationGroup()
val.animations = []
return val
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
prepareView(view)
}
func prepareView(view:UIView) -> UIView {
cardView1 = UIView(frame: CGRect(x: 140, y: 200, width: 120, height: 120))
cardView1?.backgroundColor = UIColor.cyanColor()
view.addSubview(cardView1!)
cardView2 = UIView(frame: CGRect(x: 140, y: 200, width: 120, height: 120))
cardView2?.backgroundColor = UIColor.orangeColor()
view.addSubview(cardView2!)
return view
}
func addZpositonAnimation(group:CAAnimationGroup,reverseFlag:Bool) -> CAAnimationGroup {
let zPositionAnimation:CABasicAnimation = CABasicAnimation(keyPath: "zPosition")
if !reverseFlag {
zPositionAnimation.fromValue = -1
zPositionAnimation.toValue = 1
}else{
zPositionAnimation.fromValue = 1
zPositionAnimation.toValue = -2
}
zPositionAnimation.duration = 1.2
zPositionAnimation.fillMode = kCAFillModeForwards
zPositionAnimation.removedOnCompletion = false
group.animations!.append(zPositionAnimation)
return group
}
func addPostionAnimation(group:CAAnimationGroup,reverseFlag:Bool) -> CAAnimationGroup {
let positonAnimation:CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "position")
if !reverseFlag {
positonAnimation.values = [
NSValue(CGPoint:CGPointZero),
NSValue(CGPoint:CGPointMake(80, 0)),
NSValue(CGPoint:CGPointZero)
]
}else{
positonAnimation.values = [
NSValue(CGPoint:CGPointZero),
NSValue(CGPoint:CGPointMake(-80, 0)),
NSValue(CGPoint:CGPointZero)
]
}
positonAnimation.timingFunctions = [
CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut),
CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
]
positonAnimation.duration = 1.5
positonAnimation.additive = true
// positonAnimation.removedOnCompletion = tr
// positonAnimation.fillMode = kCAFillModeRemoved
group.animations?.append(positonAnimation)
return group
}
func addRotaionAnimation(group:CAAnimationGroup,reverseFlag:Bool) -> CAAnimationGroup {
let rotationAnimation:CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "transform.rotation")
if !reverseFlag {
rotationAnimation.values = [0 , 0.15 ,0]
}else{
rotationAnimation.values = [0 , -0.15 ,0]
}
rotationAnimation.duration = 1.5
rotationAnimation.timingFunctions = [
CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut),
CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
]
group.animations?.append(rotationAnimation)
return group
}
func toolAddAnimationGroup2View(view:UIView,key:String,animationGroup:CAAnimationGroup,procFunc:((CAAnimationGroup)->(CAAnimationGroup))) -> UIView {
view.layer.addAnimation(procFunc(animationGroup), forKey: key)
return view
}
func configShow2FrontAnimationGroup(animationGroup:CAAnimationGroup) -> CAAnimationGroup {
animationGroup.animations?.removeAll()
addPostionAnimation(animationGroup, reverseFlag: false)
addZpositonAnimation(animationGroup, reverseFlag: false)
addRotaionAnimation(animationGroup, reverseFlag: false)
animationGroup.duration = 1.5
return animationGroup
}
func configHide2BackAnimatinoGroup(animationGroup:CAAnimationGroup) -> CAAnimationGroup {
animationGroup.animations?.removeAll()
addPostionAnimation(animationGroup, reverseFlag: true)
addZpositonAnimation(animationGroup, reverseFlag: true)
addRotaionAnimation(animationGroup, reverseFlag: true)
animationGroup.duration = 1.5
animationGroup.removedOnCompletion = true
animationGroup.fillMode = kCAFillModeForwards
return animationGroup
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
cardView1?.layer.zPosition = -1
toolAddAnimationGroup2View(cardView1!, key: "showAnimationGroup", animationGroup: show2FrontAnimationGroup, procFunc: configShow2FrontAnimationGroup)
toolAddAnimationGroup2View(cardView2!, key: "hideAnimationGroup", animationGroup: hide2BackAnimationGroup, procFunc: configHide2BackAnimatinoGroup)
cardView1?.layer.zPosition = 1
view.userInteractionEnabled = false
//2秒后复位
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.cardView1?.layer.zPosition = -1
self.view.userInteractionEnabled = true
}
}
}