From 62508d0213ca5721803d2fed1a086711475f59be Mon Sep 17 00:00:00 2001 From: Nick Velloff Date: Sun, 1 May 2016 03:24:31 -0700 Subject: [PATCH] Add ability to change color during animation --- GridLogo/GridLogo.swift | 129 ++++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 64 deletions(-) diff --git a/GridLogo/GridLogo.swift b/GridLogo/GridLogo.swift index 26a603b..a20f2bb 100644 --- a/GridLogo/GridLogo.swift +++ b/GridLogo/GridLogo.swift @@ -25,33 +25,38 @@ 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 { @@ -59,26 +64,20 @@ public class GridLogo: UIView { 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 @@ -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 @@ -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 @@ -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() } } \ No newline at end of file