Skip to content

Commit

Permalink
Merge pull request #12 from the-grid/optim
Browse files Browse the repository at this point in the history
Add ability to change color during animation
  • Loading branch information
nickvelloff committed May 1, 2016
2 parents 6e903a9 + 62508d0 commit 64a82fc
Showing 1 changed file with 65 additions and 64 deletions.
129 changes: 65 additions & 64 deletions GridLogo/GridLogo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,60 +25,59 @@ public class GridLogo: UIView {
static let xstep = [1,0,-1,0]
static let ystep = [0,1,0,-1]

static func shapeLayerWithLogoPath(strokeColor: UIColor, lineJoin: String, lineWidth: CGFloat, turns: Int, md: CGFloat) -> CAShapeLayer {

var curr = CGPointZero
var last = CGPointZero
var scalestep: CGFloat
let path = UIBezierPath()
path.moveToPoint(curr)

for i in 0 ..< turns {
scalestep = round((CGFloat(i) + 1) / 2.0) * CGFloat(md)
curr = CGPoint(x: CGFloat(last.x) + (scalestep * CGFloat(xstep[i % 4])), y: CGFloat(last.y) + (scalestep * CGFloat(ystep[i % 4]))).toInt()

if i + 1 == turns {
curr = CGPoint(x: CGFloat(curr.x) - (md * CGFloat(xstep[i % 4])), y: CGFloat(curr.y) - (md * CGFloat(ystep[i % 4]))).toInt()
static func shapeLayerWithLogoPath(
strokeColor: UIColor,
lineJoin: String,
lineWidth: CGFloat,
turns: Int,
md: CGFloat
) -> CAShapeLayer {
var curr = CGPointZero
var last = CGPointZero
var scalestep: CGFloat
let path = UIBezierPath()
path.moveToPoint(curr)

for i in 0 ..< turns {
scalestep = round((CGFloat(i) + 1) / 2.0) * CGFloat(md)
curr = CGPoint(x: CGFloat(last.x) + (scalestep * CGFloat(xstep[i % 4])), y: CGFloat(last.y) + (scalestep * CGFloat(ystep[i % 4]))).toInt()

if i + 1 == turns {
curr = CGPoint(x: CGFloat(curr.x) - (md * CGFloat(xstep[i % 4])), y: CGFloat(curr.y) - (md * CGFloat(ystep[i % 4]))).toInt()
}

path.addLineToPoint(curr)
last = curr
}

path.addLineToPoint(curr)
last = curr
}

let shapeLayer = CAShapeLayer()
shapeLayer.path = path.CGPath
shapeLayer.strokeColor = strokeColor.CGColor
shapeLayer.fillColor = nil
shapeLayer.lineWidth = lineWidth
shapeLayer.lineJoin = lineJoin
return shapeLayer
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.CGPath
shapeLayer.strokeColor = strokeColor.CGColor
shapeLayer.fillColor = nil
shapeLayer.lineWidth = lineWidth
shapeLayer.lineJoin = lineJoin
return shapeLayer
}

static func setupAnimation(duration: CFTimeInterval, repeatCount: Float) -> CAAnimationGroup {

let pathAnimationIn = CABasicAnimation(keyPath: "strokeEnd")
let pathAnimationOut = CABasicAnimation(keyPath: "strokeStart")
let pathAnimationGroup = CAAnimationGroup()



let startPos: CGFloat = 0.0
let endPos: CGFloat = 1.0


pathAnimationIn.fromValue = startPos
pathAnimationIn.toValue = endPos
pathAnimationIn.duration = duration / 2
pathAnimationIn.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)


pathAnimationOut.fromValue = startPos
pathAnimationOut.toValue = endPos
pathAnimationOut.duration = duration / 2
pathAnimationOut.beginTime = duration / 2
pathAnimationOut.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)


pathAnimationGroup.animations = [pathAnimationIn, pathAnimationOut]
pathAnimationGroup.duration = duration
pathAnimationGroup.repeatCount = repeatCount
Expand All @@ -91,8 +90,8 @@ public class GridLogo: UIView {
private var mystic: CGFloat = 4
private var turns: Int
private var md: CGFloat
private let bgLayer: CAShapeLayer
private let fgLayer: CAShapeLayer
private var bgLayer: CAShapeLayer
private var fgLayer: CAShapeLayer
private let pathAnimationGroup: CAAnimationGroup
private var duration: CFTimeInterval
private var reverses = false
Expand All @@ -115,18 +114,28 @@ public class GridLogo: UIView {
return animation
}()

public init(mystic m: CGFloat, duration d: CFTimeInterval, lineWidth lw: CGFloat = 1, bgColor: UIColor = UIColor(red: 51/255, green: 51/255, blue: 48/255, alpha: 1), fgColor: UIColor = UIColor(red: 1, green: 246/255, blue: 153/255, alpha: 1), turns t: Int = 9, repeatCount: Float = 14) {

public init(
mystic m: CGFloat,
duration d: CFTimeInterval,
lineWidth lw: CGFloat = 1,
bgColor: UIColor = UIColor(red: 51/255, green: 51/255, blue: 48/255, alpha: 1),
fgColor: UIColor = UIColor(red: 1, green: 246/255, blue: 153/255, alpha: 1),
lineJoin: String = kCALineJoinMiter,
turns t: Int = 9,
repeatCount: Float = 14
)
{
mystic = m
duration = d
lineWidth = lw
md = m
turns = t
bgLayer = GridLogo.shapeLayerWithLogoPath(bgColor, lineJoin: kCALineJoinMiter, lineWidth: lineWidth, turns: turns, md: md)
fgLayer = GridLogo.shapeLayerWithLogoPath(fgColor, lineJoin: kCALineJoinMiter, lineWidth: lineWidth, turns: turns, md: md)
bgLayer = GridLogo.shapeLayerWithLogoPath(bgColor, lineJoin: lineJoin, lineWidth: lineWidth, turns: turns, md: md)
fgLayer = GridLogo.shapeLayerWithLogoPath(fgColor, lineJoin: lineJoin, lineWidth: lineWidth, turns: turns, md: md)
pathAnimationGroup = GridLogo.setupAnimation(duration, repeatCount: repeatCount)

super.init(frame: CGRectZero)

layer.addSublayer(bgLayer)
layer.addSublayer(fgLayer)
userInteractionEnabled = false
Expand All @@ -136,42 +145,34 @@ public class GridLogo: UIView {
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}


public func updateLineColors(bgColor: UIColor, fgColor: UIColor, lineJoin: String = kCALineJoinMiter) {
bgLayer = GridLogo.shapeLayerWithLogoPath(bgColor, lineJoin: lineJoin, lineWidth: lineWidth, turns: turns, md: md)
fgLayer = GridLogo.shapeLayerWithLogoPath(fgColor, lineJoin: lineJoin, lineWidth: lineWidth, turns: turns, md: md)
}

public func show(completionHandler: (() -> Void)? = nil) {
self.startAnimation()

self.fgLayer.opacity = 1
self.bgLayer.opacity = 1

self.fgLayer.addAnimation(self.fadeInAnimation, forKey: "fade")
self.bgLayer.addAnimation(self.fadeInAnimation, forKey: "fade")

dispatch_after(self.fadeDuration, dispatch_get_main_queue()) {
completionHandler?()
}

public func show() {
startAnimation()
fgLayer.opacity = 1
bgLayer.opacity = 1
fgLayer.addAnimation(fadeInAnimation, forKey: "fade")
bgLayer.addAnimation(fadeInAnimation, forKey: "fade")
}

public func hide(completionHandler: (() -> Void)? = nil) {
self.fgLayer.opacity = 0
self.bgLayer.opacity = 0

self.fgLayer.addAnimation(self.fadeOutAnimation, forKey: "fade")
self.bgLayer.addAnimation(self.fadeOutAnimation, forKey: "fade")

dispatch_after(self.fadeDuration, dispatch_get_main_queue()) {
self.fgLayer.removeAllAnimations()
completionHandler?()
}
public func hide() {
fgLayer.opacity = 0
bgLayer.opacity = 0
fgLayer.addAnimation(fadeOutAnimation, forKey: "fade")
bgLayer.addAnimation(fadeOutAnimation, forKey: "fade")
}

func startAnimation() {
self.fgLayer.removeAllAnimations()
self.fgLayer.addAnimation(pathAnimationGroup, forKey: "group")
fgLayer.removeAllAnimations()
fgLayer.addAnimation(pathAnimationGroup, forKey: "group")
}

func endAnimation() {
self.fgLayer.removeAllAnimations()
fgLayer.removeAllAnimations()
}
}

0 comments on commit 64a82fc

Please sign in to comment.