Commit a202a838 by Daniel Dahan

Animation Group added

parent b5cecbfc
...@@ -30,9 +30,26 @@ public struct MaterialAnimation { ...@@ -30,9 +30,26 @@ public struct MaterialAnimation {
} }
/** /**
:name: groupAnimation
*/
public static func groupAnimation(view: UIView, animations: Array<CAAnimation>, duration: NSTimeInterval = 0.5) {
return groupAnimation(view.layer, animations: animations, duration: duration)
}
/**
:name: groupAnimation
*/
public static func groupAnimation(layer: CALayer, animations: Array<CAAnimation>, duration: NSTimeInterval = 0.5) {
let group: CAAnimationGroup = CAAnimationGroup()
group.animations = animations
group.duration = duration
layer.addAnimation(group, forKey: nil)
}
/**
:name: applyBasicAnimation :name: applyBasicAnimation
*/ */
public static func applyBasicAnimation(animation: CABasicAnimation, toLayer layer: CALayer, completion: (() -> Void)? = nil) { internal static func applyBasicAnimation(animation: CABasicAnimation, toLayer layer: CALayer, completion: (() -> Void)? = nil) {
// use presentation layer if available // use presentation layer if available
animation.fromValue = (nil == layer.presentationLayer() ? layer : layer.presentationLayer() as! CALayer).valueForKeyPath(animation.keyPath!) animation.fromValue = (nil == layer.presentationLayer() ? layer : layer.presentationLayer() as! CALayer).valueForKeyPath(animation.keyPath!)
CATransaction.begin() CATransaction.begin()
...@@ -50,8 +67,9 @@ public struct MaterialAnimation { ...@@ -50,8 +67,9 @@ public struct MaterialAnimation {
/** /**
:name: applyKeyframeAnimation :name: applyKeyframeAnimation
*/ */
public static func applyKeyframeAnimation(animation: CAKeyframeAnimation, toLayer layer: CALayer, completion: (() -> Void)? = nil) { internal static func applyKeyframeAnimation(animation: CAKeyframeAnimation, toLayer layer: CALayer) {
// use presentation layer if available // use presentation layer if available
(nil == layer.presentationLayer() ? layer : layer.presentationLayer() as! CALayer).addAnimation(animation, forKey: nil) (nil == layer.presentationLayer() ? layer : layer.presentationLayer() as! CALayer).addAnimation(animation, forKey: nil)
} }
} }
...@@ -20,53 +20,106 @@ import UIKit ...@@ -20,53 +20,106 @@ import UIKit
public extension MaterialAnimation { public extension MaterialAnimation {
/** /**
:name: backgroundColor :name: backgroundColorAnimation
*/ */
public static func backgroundColor(layer: CALayer, color: UIColor, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) { public static func backgroundColorAnimation(color: UIColor) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation() let animation: CABasicAnimation = CABasicAnimation()
animation.keyPath = "backgroundColor" animation.keyPath = "backgroundColor"
animation.duration = duration
animation.toValue = color.CGColor animation.toValue = color.CGColor
applyBasicAnimation(animation, toLayer: layer, completion: completion) return animation
} }
/** /**
:name: rotate :name: backgroundColor
*/ */
public static func rotate(view: UIView, rotations: Int = 1, duration: CFTimeInterval = 0.5, completion: (() -> Void)? = nil) { public static func backgroundColor(view: UIView, color: UIColor, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) {
rotate(view.layer, rotations: rotations, duration: duration, completion: completion) backgroundColor(view.layer, color: color, duration: duration, completion: completion)
}
/**
:name: backgroundColor
*/
public static func backgroundColor(layer: CALayer, color: UIColor, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) {
let animation: CABasicAnimation = backgroundColorAnimation(color)
animation.duration = duration
applyBasicAnimation(animation, toLayer: layer, completion: completion)
} }
/** /**
:name: rotate :name: rotationAnimation
*/ */
public static func rotate(layer: CALayer, rotations: Int = 1, duration: CFTimeInterval = 0.5, completion: (() -> Void)? = nil) { public static func rotationAnimation(rotations: Int = 1) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation() let animation: CABasicAnimation = CABasicAnimation()
animation.keyPath = "transform.rotation" animation.keyPath = "transform.rotation"
animation.duration = duration
animation.byValue = M_PI * 2 * Double(rotations) animation.byValue = M_PI * 2 * Double(rotations)
return animation
}
/**
:name: rotation
*/
public static func rotation(view: UIView, rotations: Int = 1, duration: CFTimeInterval = 0.5, completion: (() -> Void)? = nil) {
rotation(view.layer, rotations: rotations, duration: duration, completion: completion)
}
/**
:name: rotation
*/
public static func rotation(layer: CALayer, rotations: Int = 1, duration: CFTimeInterval = 0.5, completion: (() -> Void)? = nil) {
let animation: CABasicAnimation = rotationAnimation(rotations)
animation.duration = duration
applyBasicAnimation(animation, toLayer: layer, completion: completion) applyBasicAnimation(animation, toLayer: layer, completion: completion)
} }
/** /**
:name: transform :name: transformAnimation
*/ */
public static func transform(layer: CALayer, scale: CATransform3D, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) { public static func transformAnimation(scale: CATransform3D) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation() let animation: CABasicAnimation = CABasicAnimation()
animation.keyPath = "transform" animation.keyPath = "transform"
animation.duration = duration
animation.toValue = NSValue(CATransform3D: scale) animation.toValue = NSValue(CATransform3D: scale)
return animation
}
/**
:name: transform
*/
public static func transform(view: UIView, rotations: Int = 1, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) {
rotation(view.layer, rotations: rotations, duration: duration, completion: completion)
}
/**
:name: transform
*/
public static func transform(layer: CALayer, scale: CATransform3D, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) {
let animation: CABasicAnimation = transformAnimation(scale)
animation.duration = duration
applyBasicAnimation(animation, toLayer: layer, completion: completion) applyBasicAnimation(animation, toLayer: layer, completion: completion)
} }
/** /**
:name: cornerRadius :name: cornerRadiusAnimation
*/ */
public static func cornerRadius(layer: CALayer, radius: CGFloat, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) { public static func cornerRadiusAnimation(radius: CGFloat) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation() let animation: CABasicAnimation = CABasicAnimation()
animation.keyPath = "cornerRadius" animation.keyPath = "cornerRadius"
animation.toValue = radius
return animation
}
/**
:name: cornerRadius
*/
public static func cornerRadius(view: UIView, radius: CGFloat, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) {
cornerRadius(view.layer, radius: radius, duration: duration, completion: completion)
}
/**
:name: cornerRadius
*/
public static func cornerRadius(layer: CALayer, radius: CGFloat, duration: CFTimeInterval = 0.25, completion: (() -> Void)? = nil) {
let animation: CABasicAnimation = cornerRadiusAnimation(radius)
animation.duration = duration animation.duration = duration
animation.byValue = radius
applyBasicAnimation(animation, toLayer: layer, completion: completion) applyBasicAnimation(animation, toLayer: layer, completion: completion)
} }
} }
\ No newline at end of file
...@@ -42,32 +42,29 @@ public func MaterialAnimationRotationModeToValue(mode: MaterialAnimationRotation ...@@ -42,32 +42,29 @@ public func MaterialAnimationRotationModeToValue(mode: MaterialAnimationRotation
public extension MaterialAnimation { public extension MaterialAnimation {
/** /**
:name: position :name: positionAnimation
*/ */
public static func position( public static func positionAnimation(path: UIBezierPath, mode: MaterialAnimationRotationMode = .Auto) -> CAKeyframeAnimation {
view: UIView, let animation: CAKeyframeAnimation = CAKeyframeAnimation()
path: UIBezierPath, animation.keyPath = "position"
mode: MaterialAnimationRotationMode = .Auto, animation.path = path.CGPath
duration: CFTimeInterval = 1, animation.rotationMode = MaterialAnimationRotationModeToValue(mode)
completion: (() -> Void)? = nil) { return animation
position(view.layer, path: path, mode: mode, duration: duration, completion: completion)
} }
/** /**
:name: position :name: position
*/ */
public static func position( public static func position(view: UIView, path: UIBezierPath, mode: MaterialAnimationRotationMode = .Auto, duration: CFTimeInterval = 1) {
layer: CALayer, position(view.layer, path: path, mode: mode, duration: duration)
path: UIBezierPath, }
mode: MaterialAnimationRotationMode = .Auto,
duration: CFTimeInterval = 1,
completion: (() -> Void)? = nil) {
let animation: CAKeyframeAnimation = CAKeyframeAnimation() /**
animation.keyPath = "position" :name: position
*/
public static func position(layer: CALayer, path: UIBezierPath, mode: MaterialAnimationRotationMode = .Auto, duration: CFTimeInterval = 1) {
let animation: CAKeyframeAnimation = positionAnimation(path, mode: mode)
animation.duration = duration animation.duration = duration
animation.path = path.CGPath
animation.rotationMode = MaterialAnimationRotationModeToValue(mode)
applyKeyframeAnimation(animation, toLayer: layer) applyKeyframeAnimation(animation, toLayer: layer)
} }
} }
\ No newline at end of file
...@@ -80,8 +80,8 @@ public class MaterialPulseView : MaterialView { ...@@ -80,8 +80,8 @@ public class MaterialPulseView : MaterialView {
}) })
pulseLayer.hidden = false pulseLayer.hidden = false
pulseLayer.transform = CATransform3DMakeScale(3, 3, 3) MaterialAnimation.transform(pulseLayer, scale: CATransform3DMakeScale(3, 3, 3))
layer.transform = CATransform3DMakeScale(1.05, 1.05, 1.05) MaterialAnimation.transform(layer, scale: CATransform3DMakeScale(1.05, 1.05, 1.05))
} }
/** /**
...@@ -151,7 +151,7 @@ public class MaterialPulseView : MaterialView { ...@@ -151,7 +151,7 @@ public class MaterialPulseView : MaterialView {
// //
internal func shrink() { internal func shrink() {
pulseLayer.hidden = true pulseLayer.hidden = true
pulseLayer.transform = CATransform3DIdentity MaterialAnimation.transform(pulseLayer, scale: CATransform3DIdentity)
layer.transform = CATransform3DIdentity MaterialAnimation.transform(layer, scale: CATransform3DIdentity)
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment