From e7376a5f91fa7974f187253349508722c5af4f99 Mon Sep 17 00:00:00 2001 From: lexrus Date: Thu, 24 Mar 2016 22:04:07 +0800 Subject: [PATCH] Refactor string consts to enum. --- LTMorphingLabel/LTMorphingLabel+Anvil.swift | 8 +++--- LTMorphingLabel/LTMorphingLabel+Burn.swift | 12 ++++----- .../LTMorphingLabel+Evaporate.swift | 6 ++--- LTMorphingLabel/LTMorphingLabel+Fall.swift | 8 +++--- .../LTMorphingLabel+Pixelate.swift | 6 ++--- LTMorphingLabel/LTMorphingLabel+Sparkle.swift | 12 ++++----- LTMorphingLabel/LTMorphingLabel.swift | 23 ++++++++---------- .../UserInterfaceState.xcuserstate | Bin 39370 -> 38475 bytes .../LTDemoViewController.swift | 2 +- LTMorphingLabelDemo/Launch Screen.storyboard | 9 +++---- 10 files changed, 40 insertions(+), 46 deletions(-) diff --git a/LTMorphingLabel/LTMorphingLabel+Anvil.swift b/LTMorphingLabel/LTMorphingLabel+Anvil.swift index c4bd9b2..0214537 100644 --- a/LTMorphingLabel/LTMorphingLabel+Anvil.swift +++ b/LTMorphingLabel/LTMorphingLabel+Anvil.swift @@ -32,7 +32,7 @@ extension LTMorphingLabel { func AnvilLoad() { - startClosures["Anvil\(phaseStart)"] = { + startClosures["Anvil\(LTMorphingPhases.Start)"] = { self.emitterView.removeAllEmitters() guard self.newRects.count > 0 else { return } @@ -166,7 +166,7 @@ extension LTMorphingLabel { } } - progressClosures["Anvil\(phaseProgress)"] = { + progressClosures["Anvil\(LTMorphingPhases.Progress)"] = { (index: Int, progress: Float, isNewChar: Bool) in if !isNewChar { @@ -178,7 +178,7 @@ extension LTMorphingLabel { } - effectClosures["Anvil\(phaseDisappear)"] = { + effectClosures["Anvil\(LTMorphingPhases.Disappear)"] = { char, index, progress in return LTCharacterLimbo( @@ -189,7 +189,7 @@ extension LTMorphingLabel { drawingProgress: 0.0) } - effectClosures["Anvil\(phaseAppear)"] = { + effectClosures["Anvil\(LTMorphingPhases.Appear)"] = { char, index, progress in var rect = self.newRects[index] diff --git a/LTMorphingLabel/LTMorphingLabel+Burn.swift b/LTMorphingLabel/LTMorphingLabel+Burn.swift index 0ce0779..8c158ec 100644 --- a/LTMorphingLabel/LTMorphingLabel+Burn.swift +++ b/LTMorphingLabel/LTMorphingLabel+Burn.swift @@ -67,11 +67,11 @@ extension LTMorphingLabel { func BurnLoad() { - startClosures["Burn\(phaseStart)"] = { + startClosures["Burn\(LTMorphingPhases.Start)"] = { self.emitterView.removeAllEmitters() } - progressClosures["Burn\(phaseProgress)"] = { + progressClosures["Burn\(LTMorphingPhases.Progress)"] = { index, progress, isNewChar in if !isNewChar { @@ -83,7 +83,7 @@ extension LTMorphingLabel { } - effectClosures["Burn\(phaseDisappear)"] = { + effectClosures["Burn\(LTMorphingPhases.Disappear)"] = { char, index, progress in return LTCharacterLimbo( @@ -95,7 +95,7 @@ extension LTMorphingLabel { ) } - effectClosures["Burn\(phaseAppear)"] = { + effectClosures["Burn\(LTMorphingPhases.Appear)"] = { char, index, progress in if char != " " { @@ -175,7 +175,7 @@ extension LTMorphingLabel { ) } - drawingClosures["Burn\(phaseDraw)"] = { + drawingClosures["Burn\(LTMorphingPhases.Draw)"] = { (charLimbo: LTCharacterLimbo) in if charLimbo.drawingProgress > 0.0 { @@ -192,7 +192,7 @@ extension LTMorphingLabel { return false } - skipFramesClosures["Burn\(phaseSkipFrames)"] = { + skipFramesClosures["Burn\(LTMorphingPhases.SkipFrames)"] = { return 1 } } diff --git a/LTMorphingLabel/LTMorphingLabel+Evaporate.swift b/LTMorphingLabel/LTMorphingLabel+Evaporate.swift index 67fcd4f..906b5d7 100644 --- a/LTMorphingLabel/LTMorphingLabel+Evaporate.swift +++ b/LTMorphingLabel/LTMorphingLabel+Evaporate.swift @@ -32,14 +32,14 @@ extension LTMorphingLabel { func EvaporateLoad() { - progressClosures["Evaporate\(phaseProgress)"] = { + progressClosures["Evaporate\(LTMorphingPhases.Progress)"] = { (index: Int, progress: Float, isNewChar: Bool) in let j: Int = Int(round(cos(Double(index)) * 1.2)) let delay = isNewChar ? self.morphingCharacterDelay * -1.0 : self.morphingCharacterDelay return min(1.0, max(0.0, self.morphingProgress + delay * Float(j))) } - effectClosures["Evaporate\(phaseDisappear)"] = { + effectClosures["Evaporate\(LTMorphingPhases.Disappear)"] = { char, index, progress in let newProgress = LTEasing.easeOutQuint(progress, 0.0, 1.0, 1.0) @@ -55,7 +55,7 @@ extension LTMorphingLabel { drawingProgress: 0.0) } - effectClosures["Evaporate\(phaseAppear)"] = { + effectClosures["Evaporate\(LTMorphingPhases.Appear)"] = { char, index, progress in let newProgress = 1.0 - LTEasing.easeOutQuint(progress, 0.0, 1.0) diff --git a/LTMorphingLabel/LTMorphingLabel+Fall.swift b/LTMorphingLabel/LTMorphingLabel+Fall.swift index 6542441..4dd0bc8 100644 --- a/LTMorphingLabel/LTMorphingLabel+Fall.swift +++ b/LTMorphingLabel/LTMorphingLabel+Fall.swift @@ -32,7 +32,7 @@ extension LTMorphingLabel { func FallLoad() { - progressClosures["Fall\(phaseProgress)"] = { + progressClosures["Fall\(LTMorphingPhases.Progress)"] = { (index: Int, progress: Float, isNewChar: Bool) in if isNewChar { @@ -53,7 +53,7 @@ extension LTMorphingLabel { } - effectClosures["Fall\(phaseDisappear)"] = { + effectClosures["Fall\(LTMorphingPhases.Disappear)"] = { char, index, progress in return LTCharacterLimbo( @@ -64,7 +64,7 @@ extension LTMorphingLabel { drawingProgress: CGFloat(progress)) } - effectClosures["Fall\(phaseAppear)"] = { + effectClosures["Fall\(LTMorphingPhases.Appear)"] = { char, index, progress in let currentFontSize = CGFloat( @@ -82,7 +82,7 @@ extension LTMorphingLabel { } - drawingClosures["Fall\(phaseDraw)"] = { + drawingClosures["Fall\(LTMorphingPhases.Draw)"] = { limbo in if limbo.drawingProgress > 0.0 { diff --git a/LTMorphingLabel/LTMorphingLabel+Pixelate.swift b/LTMorphingLabel/LTMorphingLabel+Pixelate.swift index 36aa88b..4b22f50 100644 --- a/LTMorphingLabel/LTMorphingLabel+Pixelate.swift +++ b/LTMorphingLabel/LTMorphingLabel+Pixelate.swift @@ -32,7 +32,7 @@ extension LTMorphingLabel { func PixelateLoad() { - effectClosures["Pixelate\(phaseDisappear)"] = { + effectClosures["Pixelate\(LTMorphingPhases.Disappear)"] = { char, index, progress in return LTCharacterLimbo( @@ -43,7 +43,7 @@ extension LTMorphingLabel { drawingProgress: CGFloat(progress)) } - effectClosures["Pixelate\(phaseAppear)"] = { + effectClosures["Pixelate\(LTMorphingPhases.Appear)"] = { char, index, progress in return LTCharacterLimbo( @@ -55,7 +55,7 @@ extension LTMorphingLabel { ) } - drawingClosures["Pixelate\(phaseDraw)"] = { + drawingClosures["Pixelate\(LTMorphingPhases.Draw)"] = { limbo in if limbo.drawingProgress > 0.0 { diff --git a/LTMorphingLabel/LTMorphingLabel+Sparkle.swift b/LTMorphingLabel/LTMorphingLabel+Sparkle.swift index 9edad5e..a36fbe0 100644 --- a/LTMorphingLabel/LTMorphingLabel+Sparkle.swift +++ b/LTMorphingLabel/LTMorphingLabel+Sparkle.swift @@ -67,11 +67,11 @@ extension LTMorphingLabel { func SparkleLoad() { - startClosures["Sparkle\(phaseStart)"] = { + startClosures["Sparkle\(LTMorphingPhases.Start)"] = { self.emitterView.removeAllEmitters() } - progressClosures["Sparkle\(phaseProgress)"] = { + progressClosures["Sparkle\(LTMorphingPhases.Progress)"] = { (index: Int, progress: Float, isNewChar: Bool) in if !isNewChar { @@ -89,7 +89,7 @@ extension LTMorphingLabel { } - effectClosures["Sparkle\(phaseDisappear)"] = { + effectClosures["Sparkle\(LTMorphingPhases.Disappear)"] = { char, index, progress in return LTCharacterLimbo( @@ -100,7 +100,7 @@ extension LTMorphingLabel { drawingProgress: 0.0) } - effectClosures["Sparkle\(phaseAppear)"] = { + effectClosures["Sparkle\(LTMorphingPhases.Appear)"] = { char, index, progress in if char != " " { @@ -142,7 +142,7 @@ extension LTMorphingLabel { ) } - drawingClosures["Sparkle\(phaseDraw)"] = { + drawingClosures["Sparkle\(LTMorphingPhases.Draw)"] = { (charLimbo: LTCharacterLimbo) in if charLimbo.drawingProgress > 0.0 { @@ -159,7 +159,7 @@ extension LTMorphingLabel { return false } - skipFramesClosures["Sparkle\(phaseSkipFrames)"] = { + skipFramesClosures["Sparkle\(LTMorphingPhases.SkipFrames)"] = { return 1 } } diff --git a/LTMorphingLabel/LTMorphingLabel.swift b/LTMorphingLabel/LTMorphingLabel.swift index 2a57695..288c643 100644 --- a/LTMorphingLabel/LTMorphingLabel.swift +++ b/LTMorphingLabel/LTMorphingLabel.swift @@ -30,12 +30,9 @@ import UIKit import QuartzCore -let phaseStart = "Start" -let phaseAppear = "Appear" -let phaseDisappear = "Disappear" -let phaseDraw = "Draw" -let phaseProgress = "ManipulateProgress" -let phaseSkipFrames = "SkipFrames" +enum LTMorphingPhases: Int { + case Start, Appear, Disappear, Draw, Progress, SkipFrames +} typealias LTMorphingStartClosure = @@ -121,7 +118,7 @@ typealias LTMorphingSkipFramesClosure = morphingProgress = 0.5 } else if previousText != text { displayLink.paused = false - let closureKey = "\(morphingEffect.description)\(phaseStart)" + let closureKey = "\(morphingEffect.description)\(LTMorphingPhases.Start)" if let closure = startClosures[closureKey] { return closure() } @@ -191,7 +188,7 @@ extension LTMorphingLabel { if previousText != text && currentFrame < totalFrames + totalDelayFrames + 5 { morphingProgress += 1.0 / Float(totalFrames) - let closureKey = "\(morphingEffect.description)\(phaseSkipFrames)" + let closureKey = "\(morphingEffect.description)\(LTMorphingPhases.SkipFrames)" if let closure = skipFramesClosures[closureKey] { skipFramesCount += 1 if skipFramesCount > closure() { @@ -282,7 +279,7 @@ extension LTMorphingLabel { // Override morphing effect with closure in extenstions if let closure = effectClosures[ - "\(morphingEffect.description)\(phaseDisappear)" + "\(morphingEffect.description)\(LTMorphingPhases.Disappear)" ] { return closure(char, index: index, progress: progress) } else { @@ -320,7 +317,7 @@ extension LTMorphingLabel { ) if let closure = effectClosures[ - "\(morphingEffect.description)\(phaseAppear)" + "\(morphingEffect.description)\(LTMorphingPhases.Appear)" ] { return closure(char, index: index, progress: progress) } else { @@ -350,7 +347,7 @@ extension LTMorphingLabel { var progress: Float = 0.0 if let closure = progressClosures[ - "\(morphingEffect.description)\(phaseProgress)" + "\(morphingEffect.description)\(LTMorphingPhases.Progress)" ] { progress = closure(index: i, progress: morphingProgress, isNewChar: false) } else { @@ -370,7 +367,7 @@ extension LTMorphingLabel { var progress: Float = 0.0 if let closure = progressClosures[ - "\(morphingEffect.description)\(phaseProgress)" + "\(morphingEffect.description)\(LTMorphingPhases.Progress)" ] { progress = closure(index: i, progress: morphingProgress, isNewChar: true) } else { @@ -426,7 +423,7 @@ extension LTMorphingLabel { let willAvoidDefaultDrawing: Bool = { if let closure = drawingClosures[ - "\(morphingEffect.description)\(phaseDraw)" + "\(morphingEffect.description)\(LTMorphingPhases.Draw)" ] { return closure($0) } diff --git a/LTMorphingLabelDemo.xcodeproj/project.xcworkspace/xcuserdata/lex.xcuserdatad/UserInterfaceState.xcuserstate b/LTMorphingLabelDemo.xcodeproj/project.xcworkspace/xcuserdata/lex.xcuserdatad/UserInterfaceState.xcuserstate index 9b292d77deb36114808d65bc22efa30467def235..12d2ba97eea6335548acfb50eb8e3f2e56431700 100644 GIT binary patch delta 18388 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

DX$dvLRE|(I9_8=wchggw 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 z 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 f=%4CegmEwr7QkZTV@z1IRW{k diff --git a/LTMorphingLabelDemo/LTDemoViewController.swift b/LTMorphingLabelDemo/LTDemoViewController.swift index 0079f3f..a804164 100644 --- a/LTMorphingLabelDemo/LTDemoViewController.swift +++ b/LTMorphingLabelDemo/LTDemoViewController.swift @@ -23,7 +23,7 @@ class LTDemoViewController : UIViewController, LTMorphingLabelDelegate { "老婆和女儿" ] private var text: String { - i = i >= textArray.count ? 0 : i + 1 + i = i >= textArray.count - 1 ? 0 : i + 1 return textArray[i] } diff --git a/LTMorphingLabelDemo/Launch Screen.storyboard b/LTMorphingLabelDemo/Launch Screen.storyboard index e8946cf..2ceca44 100644 --- a/LTMorphingLabelDemo/Launch Screen.storyboard +++ b/LTMorphingLabelDemo/Launch Screen.storyboard @@ -1,7 +1,7 @@ - + - + @@ -17,22 +17,19 @@ - -