From ad95955ddd4c5f1e86e9067a943f0023cd242df0 Mon Sep 17 00:00:00 2001 From: James Tang Date: Fri, 27 Mar 2015 13:15:02 +0800 Subject: [PATCH 01/87] Update Podspec (1.0.2) to include resource fixes #44 --- Spring.podspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Spring.podspec b/Spring.podspec index c588b1d..37b387a 100644 --- a/Spring.podspec +++ b/Spring.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Spring' - s.version = '1.0.1' + s.version = '1.0.2' s.license = 'MIT' s.summary = 'A library to simplify iOS animations in Swift.' s.homepage = 'https://github.com/MengTo/Spring' @@ -9,4 +9,5 @@ Pod::Spec.new do |s| s.requires_arc = true s.ios.deployment_target = '8.0' s.source_files = 'Spring/*.swift' + s.resources = ['Spring/*.xib', 'SpringApp/*.xcassets'] end From 28e8d9052d4a0f0c9a940c8129ec2db37a2bc7fd Mon Sep 17 00:00:00 2001 From: James Tang Date: Sun, 29 Mar 2015 14:31:11 +0800 Subject: [PATCH 02/87] Make SpringApp schema to default --- .../xcshareddata/SpringApp.xccheckout | 41 ++++++ .../xcshareddata/xcschemes/SpringApp.xcscheme | 136 ++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 SpringApp.xcodeproj/project.xcworkspace/xcshareddata/SpringApp.xccheckout create mode 100644 SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme diff --git a/SpringApp.xcodeproj/project.xcworkspace/xcshareddata/SpringApp.xccheckout b/SpringApp.xcodeproj/project.xcworkspace/xcshareddata/SpringApp.xccheckout new file mode 100644 index 0000000..7c00884 --- /dev/null +++ b/SpringApp.xcodeproj/project.xcworkspace/xcshareddata/SpringApp.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 90BE4A8A-3AD7-483D-B9EA-ED8463875CE6 + IDESourceControlProjectName + SpringApp + IDESourceControlProjectOriginsDictionary + + 71F5D8D885CFF6BD7151066D7BFF25CC48A5235E + github.com:MengTo/Spring.git + + IDESourceControlProjectPath + SpringApp.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 71F5D8D885CFF6BD7151066D7BFF25CC48A5235E + ../.. + + IDESourceControlProjectURL + github.com:MengTo/Spring.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 71F5D8D885CFF6BD7151066D7BFF25CC48A5235E + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 71F5D8D885CFF6BD7151066D7BFF25CC48A5235E + IDESourceControlWCCName + Spring + + + + diff --git a/SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme b/SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme new file mode 100644 index 0000000..06c9955 --- /dev/null +++ b/SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c96f45b659c3842857068a5aa1b46f2b18cd4a0d Mon Sep 17 00:00:00 2001 From: Chao Ruan Date: Tue, 31 Mar 2015 22:20:26 +1100 Subject: [PATCH 03/87] Support swift 1.2 --- Spring/DesignableTabBarController.swift | 22 +++++++-------- Spring/LoadingView.swift | 2 +- Spring/Misc.swift | 4 +-- Spring/Spring.swift | 37 +++++++++++++------------ SpringApp/OptionsViewController.swift | 12 ++++---- SpringApp/SpringViewController.swift | 18 ++++++------ 6 files changed, 48 insertions(+), 47 deletions(-) diff --git a/Spring/DesignableTabBarController.swift b/Spring/DesignableTabBarController.swift index 5637f80..bbaa6f4 100644 --- a/Spring/DesignableTabBarController.swift +++ b/Spring/DesignableTabBarController.swift @@ -46,8 +46,8 @@ import UIKit @IBInspectable var firstSelectedImage: UIImage? { didSet { - if let image = firstSelectedImage? { - var tabBarItems = self.tabBar.items as [UITabBarItem] + if let image = firstSelectedImage { + var tabBarItems = self.tabBar.items as! [UITabBarItem] tabBarItems[0].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -55,8 +55,8 @@ import UIKit @IBInspectable var secondSelectedImage: UIImage? { didSet { - if let image = secondSelectedImage? { - var tabBarItems = self.tabBar.items as [UITabBarItem] + if let image = secondSelectedImage { + var tabBarItems = self.tabBar.items as! [UITabBarItem] tabBarItems[1].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -64,8 +64,8 @@ import UIKit @IBInspectable var thirdSelectedImage: UIImage? { didSet { - if let image = thirdSelectedImage? { - var tabBarItems = self.tabBar.items as [UITabBarItem] + if let image = thirdSelectedImage { + var tabBarItems = self.tabBar.items as! [UITabBarItem] tabBarItems[2].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -73,8 +73,8 @@ import UIKit @IBInspectable var fourthSelectedImage: UIImage? { didSet { - if let image = fourthSelectedImage? { - var tabBarItems = self.tabBar.items as [UITabBarItem] + if let image = fourthSelectedImage { + var tabBarItems = self.tabBar.items as! [UITabBarItem] tabBarItems[3].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -82,8 +82,8 @@ import UIKit @IBInspectable var fifthSelectedImage: UIImage? { didSet { - if let image = fifthSelectedImage? { - var tabBarItems = self.tabBar.items as [UITabBarItem] + if let image = fifthSelectedImage { + var tabBarItems = self.tabBar.items as! [UITabBarItem] tabBarItems[4].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -92,7 +92,7 @@ import UIKit override func viewDidLoad() { super.viewDidLoad() - for item in self.tabBar.items as [UITabBarItem] { + for item in self.tabBar.items as! [UITabBarItem] { if let image = item.image { item.image = image.imageWithColor(self.normalTint).imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) } diff --git a/Spring/LoadingView.swift b/Spring/LoadingView.swift index 0e013a7..8884037 100644 --- a/Spring/LoadingView.swift +++ b/Spring/LoadingView.swift @@ -37,7 +37,7 @@ public class LoadingView: UIView { } class func designCodeLoadingView() -> UIView { - return NSBundle(forClass: self).loadNibNamed("LoadingView", owner: self, options: nil)[0] as UIView + return NSBundle(forClass: self).loadNibNamed("LoadingView", owner: self, options: nil)[0] as! UIView } } diff --git a/Spring/Misc.swift b/Spring/Misc.swift index 7b9ed9d..b537590 100644 --- a/Spring/Misc.swift +++ b/Spring/Misc.swift @@ -23,7 +23,7 @@ import UIKit public extension String { - public var length: Int { return countElements(self) } + public var length: Int { return count(self) } public func toURL() -> NSURL? { return NSURL(string: self) @@ -72,7 +72,7 @@ public extension UIColor { let scanner = NSScanner(string: hex) var hexValue: CUnsignedLongLong = 0 if scanner.scanHexLongLong(&hexValue) { - switch (countElements(hex)) { + switch (count(hex)) { case 3: red = CGFloat((hexValue & 0xF00) >> 8) / 15.0 green = CGFloat((hexValue & 0x0F0) >> 4) / 15.0 diff --git a/Spring/Spring.swift b/Spring/Spring.swift index 628ecd8..588f2e4 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -452,30 +452,31 @@ public class Spring : NSObject { initialSpringVelocity: velocity, options: getAnimationOptions(curve), animations: { [weak self] in - if let _self = self - { - if _self.animateFrom { - _self.transform = CGAffineTransformIdentity - _self.alpha = 1 - } - else { - let translate = CGAffineTransformMakeTranslation(_self.x, _self.y) - let scale = CGAffineTransformMakeScale(_self.scaleX, _self.scaleY) - let rotate = CGAffineTransformMakeRotation(_self.rotate) - let translateAndScale = CGAffineTransformConcat(translate, scale) - _self.transform = CGAffineTransformConcat(rotate, translateAndScale) - - _self.alpha = _self.opacity - } + if let _self = self + { + if _self.animateFrom { + _self.transform = CGAffineTransformIdentity + _self.alpha = 1 + } + else { + let translate = CGAffineTransformMakeTranslation(_self.x, _self.y) + let scale = CGAffineTransformMakeScale(_self.scaleX, _self.scaleY) + let rotate = CGAffineTransformMakeRotation(_self.rotate) + let translateAndScale = CGAffineTransformConcat(translate, scale) + _self.transform = CGAffineTransformConcat(rotate, translateAndScale) + _self.alpha = _self.opacity } - }, { [weak self] finished in + } + + }, completion: { [weak self] finished in completion() self?.resetAll() - - }) + + }) + } func reset() { diff --git a/SpringApp/OptionsViewController.swift b/SpringApp/OptionsViewController.swift index 1cba77c..251a54a 100644 --- a/SpringApp/OptionsViewController.swift +++ b/SpringApp/OptionsViewController.swift @@ -68,37 +68,37 @@ class OptionsViewController: UIViewController { } @IBAction func dampingSliderChanged(sender: AnyObject) { - selectedDamping = sender.valueForKey("value") as CGFloat + selectedDamping = sender.valueForKey("value") as! CGFloat delegate?.dampingSliderChanged(sender) dampingLabel.text = getString("Damping", value: selectedDamping) } @IBAction func velocitySliderChanged(sender: AnyObject) { - selectedVelocity = sender.valueForKey("value") as CGFloat + selectedVelocity = sender.valueForKey("value") as! CGFloat delegate?.velocitySliderChanged(sender) velocityLabel.text = getString("Velocity", value: selectedVelocity) } @IBAction func scaleSliderChanged(sender: AnyObject) { - selectedScale = sender.valueForKey("value") as CGFloat + selectedScale = sender.valueForKey("value") as! CGFloat delegate?.scaleSliderChanged(sender) scaleLabel.text = getString("Scale", value: selectedScale) } @IBAction func xSliderChanged(sender: AnyObject) { - selectedX = sender.valueForKey("value") as CGFloat + selectedX = sender.valueForKey("value") as! CGFloat delegate?.xSliderChanged(sender) xLabel.text = getString("X", value: selectedX) } @IBAction func ySliderChanged(sender: AnyObject) { - selectedY = sender.valueForKey("value") as CGFloat + selectedY = sender.valueForKey("value") as! CGFloat delegate?.ySliderChanged(sender) yLabel.text = getString("Y", value: selectedY) } @IBAction func rotateSliderChanged(sender: AnyObject) { - selectedRotate = sender.valueForKey("value") as CGFloat + selectedRotate = sender.valueForKey("value") as! CGFloat delegate?.rotateSliderChanged(sender) rotateLabel.text = getString("Rotate", value: selectedRotate) } diff --git a/SpringApp/SpringViewController.swift b/SpringApp/SpringViewController.swift index e38d8bd..a401517 100644 --- a/SpringApp/SpringViewController.swift +++ b/SpringApp/SpringViewController.swift @@ -35,48 +35,48 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView var selectedRotate: CGFloat = 0 @IBAction func forceSliderChanged(sender: AnyObject) { - selectedForce = sender.valueForKey("value") as CGFloat + selectedForce = sender.valueForKey("value") as! CGFloat animateView() forceLabel.text = String(format: "Force: %.1f", Double(selectedForce)) } @IBAction func durationSliderChanged(sender: AnyObject) { - selectedDuration = sender.valueForKey("value") as CGFloat + selectedDuration = sender.valueForKey("value") as! CGFloat animateView() durationLabel.text = String(format: "Duration: %.1f", Double(selectedDuration)) } @IBAction func delaySliderChanged(sender: AnyObject) { - selectedDelay = sender.valueForKey("value") as CGFloat + selectedDelay = sender.valueForKey("value") as! CGFloat animateView() delayLabel.text = String(format: "Delay: %.1f", Double(selectedDelay)) } func dampingSliderChanged(sender: AnyObject) { - selectedDamping = sender.valueForKey("value") as CGFloat + selectedDamping = sender.valueForKey("value") as! CGFloat animateView() } func velocitySliderChanged(sender: AnyObject) { - selectedVelocity = sender.valueForKey("value") as CGFloat + selectedVelocity = sender.valueForKey("value") as! CGFloat animateView() } func scaleSliderChanged(sender: AnyObject) { - selectedScale = sender.valueForKey("value") as CGFloat + selectedScale = sender.valueForKey("value") as! CGFloat animateView() } func xSliderChanged(sender: AnyObject) { - selectedX = sender.valueForKey("value") as CGFloat + selectedX = sender.valueForKey("value") as! CGFloat animateView() } func ySliderChanged(sender: AnyObject) { - selectedY = sender.valueForKey("value") as CGFloat + selectedY = sender.valueForKey("value") as! CGFloat animateView() } func rotateSliderChanged(sender: AnyObject) { - selectedRotate = sender.valueForKey("value") as CGFloat + selectedRotate = sender.valueForKey("value") as! CGFloat animateView() } From 89a0425b4b046751b5be2214c882cc53bd5bdc34 Mon Sep 17 00:00:00 2001 From: Meng To Date: Thu, 9 Apr 2015 01:22:01 +0900 Subject: [PATCH 04/87] Fix animateTo completion for some animations --- Spring/Spring.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index 628ecd8..bdb7246 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -103,6 +103,7 @@ public class Spring : NSObject { private var alpha: CGFloat { get { return view.alpha } set { view.alpha = newValue } } func animatePreset() { + alpha = 0.99 if animation == "" { return } From c51c19224cc717a4fb8980a22782892a88d08508 Mon Sep 17 00:00:00 2001 From: Meng To Date: Fri, 10 Apr 2015 20:29:25 +0900 Subject: [PATCH 05/87] Fix warning for 1.2 --- Spring/DesignableTabBarController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Spring/DesignableTabBarController.swift b/Spring/DesignableTabBarController.swift index bbaa6f4..fc57f65 100644 --- a/Spring/DesignableTabBarController.swift +++ b/Spring/DesignableTabBarController.swift @@ -33,7 +33,7 @@ import UIKit @IBInspectable var selectedTint: UIColor = UIColor.clearColor() { didSet { - UITabBar.appearance().selectedImageTintColor = selectedTint + UITabBar.appearance().tintColor = selectedTint UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: selectedTint], forState:UIControlState.Selected) } } From 096a1dd26a692c19107f4a61c4a88c725056652e Mon Sep 17 00:00:00 2001 From: jasdev Date: Sat, 11 Apr 2015 15:27:35 -0700 Subject: [PATCH 06/87] README Pod update and whitespace --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3ec18ae..0db91ec 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ ## Installation Drop in the Spring folder to your Xcode project. -Or via CocoaPods pre-release: -`pod 'Spring', '~> 1.0.1'` +Or via CocoaPods: +`pod 'Spring', '~> 1.0.2'` ## Usage with Storyboard In Identity Inspector, connect the UIView to SpringView Class and set the animation properties in Attribute Inspector. @@ -61,9 +61,9 @@ In Identity Inspector, connect the UIView to SpringView Class and set the animat ## Curve spring - linear - easeIn - easeOut + linear + easeIn + easeOut easeInOut ## Properties @@ -102,4 +102,3 @@ Animations using IBInspectables are currently not working in iOS 7. iOS 8 is sup ## License Spring is released under the MIT license. See LICENSE for details. - From e4c8c09b96b68d1bc6dc64f3c388f018748ad33a Mon Sep 17 00:00:00 2001 From: James Tang Date: Sun, 12 Apr 2015 23:55:10 +0800 Subject: [PATCH 07/87] v1.0.3 --- README.md | 4 +++- Spring.podspec | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0db91ec..a8322e3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Drop in the Spring folder to your Xcode project. Or via CocoaPods: -`pod 'Spring', '~> 1.0.2'` +`pod 'Spring', '~> 1.0.3'` ## Usage with Storyboard In Identity Inspector, connect the UIView to SpringView Class and set the animation properties in Attribute Inspector. @@ -92,6 +92,8 @@ Animations won't autostart when view is reached via performSegueWithIdentifier. Animations using IBInspectables are currently not working in iOS 7. iOS 8 is supported. We're looking for a fix. Animations in code works for both iOS 7 and 8. +This project now requires Xcode 6.3 and Swift 1.2. For old version please download [1.0.2](https://github.com/MengTo/Spring/tree/1.0.2) + ## Tutorials - Tutorials available on [Design+Code](https://designcode.io/swiftapp). - [Integrate Spring to existing Objective-C projects](https://medium.com/ios-apprentice/using-swift-in-objective-c-projects-f7e7a09f8be) diff --git a/Spring.podspec b/Spring.podspec index 37b387a..a381019 100644 --- a/Spring.podspec +++ b/Spring.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Spring' - s.version = '1.0.2' + s.version = '1.0.3' s.license = 'MIT' s.summary = 'A library to simplify iOS animations in Swift.' s.homepage = 'https://github.com/MengTo/Spring' From d3623430c59a0b8bf36f908a4ce284f641ce9375 Mon Sep 17 00:00:00 2001 From: Meng To Date: Mon, 8 Jun 2015 22:30:25 -0700 Subject: [PATCH 08/87] Fix for Swift 2 with some warnings - Couldn't find solution for timeAgoSinceDate - Has some warnings --- Spring/BlurView.swift | 4 +- Spring/DesignableLabel.swift | 8 +- Spring/DesignableTabBarController.swift | 12 +- Spring/DesignableTextField.swift | 8 +- Spring/DesignableTextView.swift | 8 +- Spring/ImageLoader.swift | 12 +- Spring/KeyboardLayoutConstraint.swift | 4 +- Spring/LoadingView.swift | 6 +- Spring/Misc.swift | 147 ++++++++++++------------ Spring/SoundPlayer.swift | 2 +- Spring/SpringAnimation.swift | 6 +- Spring/TransitionManager.swift | 6 +- Spring/TransitionZoom.swift | 6 +- SpringApp.xcodeproj/project.pbxproj | 1 + SpringApp/SpringViewController.swift | 4 +- 15 files changed, 120 insertions(+), 114 deletions(-) diff --git a/Spring/BlurView.swift b/Spring/BlurView.swift index 4583633..c512b98 100644 --- a/Spring/BlurView.swift +++ b/Spring/BlurView.swift @@ -25,8 +25,8 @@ import UIKit public func insertBlurView (view: UIView, style: UIBlurEffectStyle) { view.backgroundColor = UIColor.clearColor() - var blurEffect = UIBlurEffect(style: style) - var blurEffectView = UIVisualEffectView(effect: blurEffect) + let blurEffect = UIBlurEffect(style: style) + let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = view.bounds view.insertSubview(blurEffectView, atIndex: 0) } \ No newline at end of file diff --git a/Spring/DesignableLabel.swift b/Spring/DesignableLabel.swift index e982cb4..146174b 100644 --- a/Spring/DesignableLabel.swift +++ b/Spring/DesignableLabel.swift @@ -26,13 +26,13 @@ import UIKit @IBInspectable public var lineHeight: CGFloat = 1.5 { didSet { - var font = UIFont(name: self.font.fontName, size: self.font.pointSize) - var text = self.text + let font = UIFont(name: self.font.fontName, size: self.font.pointSize) + let text = self.text - var paragraphStyle = NSMutableParagraphStyle() + let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineHeight - var attributedString = NSMutableAttributedString(string: text!) + let attributedString = NSMutableAttributedString(string: text!) attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedString.length)) attributedString.addAttribute(NSFontAttributeName, value: font!, range: NSMakeRange(0, attributedString.length)) diff --git a/Spring/DesignableTabBarController.swift b/Spring/DesignableTabBarController.swift index fc57f65..482d7ca 100644 --- a/Spring/DesignableTabBarController.swift +++ b/Spring/DesignableTabBarController.swift @@ -47,7 +47,7 @@ import UIKit @IBInspectable var firstSelectedImage: UIImage? { didSet { if let image = firstSelectedImage { - var tabBarItems = self.tabBar.items as! [UITabBarItem] + var tabBarItems = self.tabBar.items as [UITabBarItem]! tabBarItems[0].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -56,7 +56,7 @@ import UIKit @IBInspectable var secondSelectedImage: UIImage? { didSet { if let image = secondSelectedImage { - var tabBarItems = self.tabBar.items as! [UITabBarItem] + var tabBarItems = self.tabBar.items as [UITabBarItem]! tabBarItems[1].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -65,7 +65,7 @@ import UIKit @IBInspectable var thirdSelectedImage: UIImage? { didSet { if let image = thirdSelectedImage { - var tabBarItems = self.tabBar.items as! [UITabBarItem] + var tabBarItems = self.tabBar.items as [UITabBarItem]! tabBarItems[2].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -74,7 +74,7 @@ import UIKit @IBInspectable var fourthSelectedImage: UIImage? { didSet { if let image = fourthSelectedImage { - var tabBarItems = self.tabBar.items as! [UITabBarItem] + var tabBarItems = self.tabBar.items as [UITabBarItem]! tabBarItems[3].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -83,7 +83,7 @@ import UIKit @IBInspectable var fifthSelectedImage: UIImage? { didSet { if let image = fifthSelectedImage { - var tabBarItems = self.tabBar.items as! [UITabBarItem] + var tabBarItems = self.tabBar.items as [UITabBarItem]! tabBarItems[4].selectedImage = image.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) } } @@ -92,7 +92,7 @@ import UIKit override func viewDidLoad() { super.viewDidLoad() - for item in self.tabBar.items as! [UITabBarItem] { + for item in self.tabBar.items as [UITabBarItem]! { if let image = item.image { item.image = image.imageWithColor(self.normalTint).imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) } diff --git a/Spring/DesignableTextField.swift b/Spring/DesignableTextField.swift index 7d70e2b..4c2656e 100644 --- a/Spring/DesignableTextField.swift +++ b/Spring/DesignableTextField.swift @@ -34,7 +34,7 @@ import UIKit @IBInspectable public var sidePadding: CGFloat = 0 { didSet { - var padding = UIView(frame: CGRectMake(0, 0, sidePadding, sidePadding)) + let padding = UIView(frame: CGRectMake(0, 0, sidePadding, sidePadding)) leftViewMode = UITextFieldViewMode.Always leftView = padding @@ -46,7 +46,7 @@ import UIKit @IBInspectable public var leftPadding: CGFloat = 0 { didSet { - var padding = UIView(frame: CGRectMake(0, 0, leftPadding, 0)) + let padding = UIView(frame: CGRectMake(0, 0, leftPadding, 0)) leftViewMode = UITextFieldViewMode.Always leftView = padding @@ -55,7 +55,7 @@ import UIKit @IBInspectable public var rightPadding: CGFloat = 0 { didSet { - var padding = UIView(frame: CGRectMake(0, 0, 0, rightPadding)) + let padding = UIView(frame: CGRectMake(0, 0, 0, rightPadding)) rightViewMode = UITextFieldViewMode.Always rightView = padding @@ -82,7 +82,7 @@ import UIKit @IBInspectable public var lineHeight: CGFloat = 1.5 { didSet { - var font = UIFont(name: self.font.fontName, size: self.font.pointSize) + var font = UIFont(name: self.font!.fontName, size: self.font!.pointSize) var text = self.text var paragraphStyle = NSMutableParagraphStyle() diff --git a/Spring/DesignableTextView.swift b/Spring/DesignableTextView.swift index cec69e6..27fe285 100644 --- a/Spring/DesignableTextView.swift +++ b/Spring/DesignableTextView.swift @@ -44,13 +44,13 @@ import UIKit @IBInspectable public var lineHeight: CGFloat = 1.5 { didSet { - var font = UIFont(name: self.font.fontName, size: self.font.pointSize) - var text = self.text + let font = UIFont(name: self.font!.fontName, size: self.font!.pointSize) + let text = self.text - var paragraphStyle = NSMutableParagraphStyle() + let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineHeight - var attributedString = NSMutableAttributedString(string: text!) + let attributedString = NSMutableAttributedString(string: text!) attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedString.length)) attributedString.addAttribute(NSFontAttributeName, value: font!, range: NSMakeRange(0, attributedString.length)) diff --git a/Spring/ImageLoader.swift b/Spring/ImageLoader.swift index fe13699..cec5fd6 100755 --- a/Spring/ImageLoader.swift +++ b/Spring/ImageLoader.swift @@ -37,7 +37,7 @@ public class ImageLoader { public func imageForUrl(urlString: String, completionHandler:(image: UIImage?, url: String) -> ()) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in - var data: NSData? = self.cache.objectForKey(urlString) as? NSData + let data: NSData? = self.cache.objectForKey(urlString) as? NSData if let goodData = data { let image = UIImage(data: goodData) @@ -47,23 +47,23 @@ public class ImageLoader { return } - var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in + let downloadTask: NSURLSessionTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: { (data, response, error) -> Void in if (error != nil) { completionHandler(image: nil, url: urlString) return } if data != nil { - let image = UIImage(data: data) - self.cache.setObject(data, forKey: urlString) + let image = UIImage(data: data!) + self.cache.setObject(data!, forKey: urlString) dispatch_async(dispatch_get_main_queue(), {() in completionHandler(image: image, url: urlString) }) return } - - }) + })! downloadTask.resume() + }) } diff --git a/Spring/KeyboardLayoutConstraint.swift b/Spring/KeyboardLayoutConstraint.swift index b8dfe5e..1fad0b5 100644 --- a/Spring/KeyboardLayoutConstraint.swift +++ b/Spring/KeyboardLayoutConstraint.swift @@ -53,7 +53,7 @@ public class KeyboardLayoutConstraint: NSLayoutConstraint { switch (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber, userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber) { case let (.Some(duration), .Some(curve)): - let options = UIViewAnimationOptions(curve.unsignedLongValue) + let options = UIViewAnimationOptions(rawValue: curve.unsignedLongValue) UIView.animateWithDuration( NSTimeInterval(duration.doubleValue), @@ -82,7 +82,7 @@ public class KeyboardLayoutConstraint: NSLayoutConstraint { switch (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber, userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber) { case let (.Some(duration), .Some(curve)): - let options = UIViewAnimationOptions(curve.unsignedLongValue) + let options = UIViewAnimationOptions(rawValue: curve.unsignedLongValue) UIView.animateWithDuration( NSTimeInterval(duration.doubleValue), diff --git a/Spring/LoadingView.swift b/Spring/LoadingView.swift index 8884037..a763140 100644 --- a/Spring/LoadingView.swift +++ b/Spring/LoadingView.swift @@ -60,7 +60,7 @@ public extension UIView { self.addSubview(loadingXibView) loadingXibView.alpha = 0 - spring(0.7, { + spring(0.7, animations: { loadingXibView.alpha = 1 }) } @@ -70,10 +70,10 @@ public extension UIView { if let loadingXibView = self.viewWithTag(LoadingViewConstants.Tag) { loadingXibView.alpha = 1 - springWithCompletion(0.7, { + springWithCompletion(0.7, animations: { loadingXibView.alpha = 0 loadingXibView.transform = CGAffineTransformMakeScale(3, 3) - }, { (completed) -> Void in + }, completion: { (completed) -> Void in loadingXibView.removeFromSuperview() }) } diff --git a/Spring/Misc.swift b/Spring/Misc.swift index b537590..84211d7 100644 --- a/Spring/Misc.swift +++ b/Spring/Misc.swift @@ -23,7 +23,7 @@ import UIKit public extension String { - public var length: Int { return count(self) } + public var length: Int { return self.characters.count } public func toURL() -> NSURL? { return NSURL(string: self) @@ -32,7 +32,12 @@ public extension String { public func htmlToAttributedString(text: String) -> NSAttributedString! { let htmlData = text.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) - let htmlString = NSAttributedString(data: htmlData!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil) + let htmlString: NSAttributedString? + do { + htmlString = try NSAttributedString(data: htmlData!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) + } catch _ { + htmlString = nil + } return htmlString } @@ -72,7 +77,7 @@ public extension UIColor { let scanner = NSScanner(string: hex) var hexValue: CUnsignedLongLong = 0 if scanner.scanHexLongLong(&hexValue) { - switch (count(hex)) { + switch (hex.characters.count) { case 3: red = CGFloat((hexValue & 0xF00) >> 8) / 15.0 green = CGFloat((hexValue & 0x0F0) >> 4) / 15.0 @@ -92,10 +97,10 @@ public extension UIColor { blue = CGFloat((hexValue & 0x0000FF00) >> 8) / 255.0 alpha = CGFloat(hexValue & 0x000000FF) / 255.0 default: - print("Invalid RGB string, number of characters after '#' should be either 3, 4, 6 or 8") + print("Invalid RGB string, number of characters after '#' should be either 3, 4, 6 or 8", appendNewline: false) } } else { - println("Scan hex error") + print("Scan hex error") } self.init(red:red, green:green, blue:blue, alpha:alpha) } @@ -135,77 +140,77 @@ public func randomStringWithLength (len : Int) -> NSString { let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - var randomString : NSMutableString = NSMutableString(capacity: len) + let randomString : NSMutableString = NSMutableString(capacity: len) for (var i=0; i < len; i++){ - var length = UInt32 (letters.length) - var rand = arc4random_uniform(length) + let length = UInt32 (letters.length) + let rand = arc4random_uniform(length) randomString.appendFormat("%C", letters.characterAtIndex(Int(rand))) } return randomString } -public func timeAgoSinceDate(date:NSDate, numericDates:Bool) -> String { - let calendar = NSCalendar.currentCalendar() - let unitFlags = NSCalendarUnit.CalendarUnitMinute | NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitWeekOfYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitSecond - let now = NSDate() - let earliest = now.earlierDate(date) - let latest = now.laterDate(date) - let components:NSDateComponents = calendar.components(unitFlags, fromDate: earliest, toDate: latest, options: nil) - - if (components.year >= 2) { - return "\(components.year)y" - } else if (components.year >= 1){ - if (numericDates){ - return "1y" - } else { - return "1y" - } - } else if (components.month >= 2) { - return "\(components.month * 4)w" - } else if (components.month >= 1){ - if (numericDates){ - return "4w" - } else { - return "4w" - } - } else if (components.weekOfYear >= 2) { - return "\(components.weekOfYear)w" - } else if (components.weekOfYear >= 1){ - if (numericDates){ - return "1w" - } else { - return "1w" - } - } else if (components.day >= 2) { - return "\(components.day)d" - } else if (components.day >= 1){ - if (numericDates){ - return "1d" - } else { - return "1d" - } - } else if (components.hour >= 2) { - return "\(components.hour)h" - } else if (components.hour >= 1){ - if (numericDates){ - return "1h" - } else { - return "1h" - } - } else if (components.minute >= 2) { - return "\(components.minute)m" - } else if (components.minute >= 1){ - if (numericDates){ - return "1m" - } else { - return "1m" - } - } else if (components.second >= 3) { - return "\(components.second)s" - } else { - return "now" - } - -} \ No newline at end of file +//public func timeAgoSinceDate(date:NSDate, numericDates:Bool) -> String { +// let calendar = NSCalendar.currentCalendar() +// let unitFlags: NSCalendarUnit = [NSCalendarUnit.Minute, NSCalendarUnit.Hour, NSCalendarUnit.Day, NSCalendarUnit.WeekOfYear, NSCalendarUnit.Month, NSCalendarUnit.Year, NSCalendarUnit.Second] +// let now = NSDate() +// let earliest = now.earlierDate(date) +// let latest = (earliest == now) ? date : now +// let components:NSDateComponents = calendar.components(unitFlags, fromDate: earliest, toDate: latest, options: nil) +// +// if (components.year >= 2) { +// return "\(components.year)y" +// } else if (components.year >= 1){ +// if (numericDates){ +// return "1y" +// } else { +// return "1y" +// } +// } else if (components.month >= 2) { +// return "\(components.month * 4)w" +// } else if (components.month >= 1){ +// if (numericDates){ +// return "4w" +// } else { +// return "4w" +// } +// } else if (components.weekOfYear >= 2) { +// return "\(components.weekOfYear)w" +// } else if (components.weekOfYear >= 1){ +// if (numericDates){ +// return "1w" +// } else { +// return "1w" +// } +// } else if (components.day >= 2) { +// return "\(components.day)d" +// } else if (components.day >= 1){ +// if (numericDates){ +// return "1d" +// } else { +// return "1d" +// } +// } else if (components.hour >= 2) { +// return "\(components.hour)h" +// } else if (components.hour >= 1){ +// if (numericDates){ +// return "1h" +// } else { +// return "1h" +// } +// } else if (components.minute >= 2) { +// return "\(components.minute)m" +// } else if (components.minute >= 1){ +// if (numericDates){ +// return "1m" +// } else { +// return "1m" +// } +// } else if (components.second >= 3) { +// return "\(components.second)s" +// } else { +// return "now" +// } +// +//} \ No newline at end of file diff --git a/Spring/SoundPlayer.swift b/Spring/SoundPlayer.swift index d39830c..11b595a 100644 --- a/Spring/SoundPlayer.swift +++ b/Spring/SoundPlayer.swift @@ -50,7 +50,7 @@ public class SoundPlayer: NSObject { AudioServicesPlaySystemSound(soundID) } else { - println("Could not find sound file name `\(soundFile)`") + print("Could not find sound file name `\(soundFile)`") } } diff --git a/Spring/SpringAnimation.swift b/Spring/SpringAnimation.swift index ff5d787..4534317 100644 --- a/Spring/SpringAnimation.swift +++ b/Spring/SpringAnimation.swift @@ -29,7 +29,7 @@ public func spring(duration: NSTimeInterval, animations: (() -> Void)!) { delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.7, - options: nil, + options: [], animations: { animations() @@ -100,7 +100,7 @@ public func springWithDelay(duration: NSTimeInterval, delay: NSTimeInterval, ani delay: delay, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.7, - options: nil, + options: [], animations: { animations() @@ -116,7 +116,7 @@ public func springWithCompletion(duration: NSTimeInterval, animations: (() -> Vo delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.7, - options: nil, + options: [], animations: { animations() diff --git a/Spring/TransitionManager.swift b/Spring/TransitionManager.swift index 401e1c3..0c9608a 100644 --- a/Spring/TransitionManager.swift +++ b/Spring/TransitionManager.swift @@ -28,7 +28,7 @@ public class TransitionManager: NSObject, UIViewControllerTransitioningDelegate, var duration = 0.3 public func animateTransition(transitionContext: UIViewControllerContextTransitioning) { - let container = transitionContext.containerView() + let container = transitionContext.containerView()! let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)! let toView = transitionContext.viewForKey(UITransitionContextToViewKey)! @@ -65,12 +65,12 @@ public class TransitionManager: NSObject, UIViewControllerTransitioningDelegate, } } - delay(duration, { + delay(duration, closure: { transitionContext.completeTransition(true) }) } - public func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { + public func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { return duration } diff --git a/Spring/TransitionZoom.swift b/Spring/TransitionZoom.swift index da1f4bc..3b5112b 100644 --- a/Spring/TransitionZoom.swift +++ b/Spring/TransitionZoom.swift @@ -28,7 +28,7 @@ public class TransitionZoom: NSObject, UIViewControllerTransitioningDelegate, UI var duration = 0.4 public func animateTransition(transitionContext: UIViewControllerContextTransitioning) { - let container = transitionContext.containerView() + let container = transitionContext.containerView()! let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)! let toView = transitionContext.viewForKey(UITransitionContextToViewKey)! @@ -57,12 +57,12 @@ public class TransitionZoom: NSObject, UIViewControllerTransitioningDelegate, UI } } - delay(duration, { + delay(duration, closure: { transitionContext.completeTransition(true) }) } - public func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { + public func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { return duration } diff --git a/SpringApp.xcodeproj/project.pbxproj b/SpringApp.xcodeproj/project.pbxproj index a16045e..f0b4814 100644 --- a/SpringApp.xcodeproj/project.pbxproj +++ b/SpringApp.xcodeproj/project.pbxproj @@ -407,6 +407,7 @@ 964117331A5BE90A000E3A5A /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0620; ORGANIZATIONNAME = "Meng To"; TargetAttributes = { diff --git a/SpringApp/SpringViewController.swift b/SpringApp/SpringViewController.swift index a401517..bfa4c85 100644 --- a/SpringApp/SpringViewController.swift +++ b/SpringApp/SpringViewController.swift @@ -103,14 +103,14 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView } func minimizeView(sender: AnyObject) { - spring(0.7, { + spring(0.7, animations: { self.view.transform = CGAffineTransformMakeScale(0.935, 0.935) }) UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) } func maximizeView(sender: AnyObject) { - spring(0.7, { + spring(0.7, animations: { self.view.transform = CGAffineTransformMakeScale(1, 1) }) UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.Default, animated: true) From b42692af30c6fc58048e992359d229cd90e8a068 Mon Sep 17 00:00:00 2001 From: Meng To Date: Mon, 8 Jun 2015 23:11:17 -0700 Subject: [PATCH 09/87] Fixed warnings, timeAgo still not working --- Spring/DesignableTextField.swift | 8 ++++---- Spring/LoadingView.swift | 2 +- SpringApp/SpringViewController.swift | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Spring/DesignableTextField.swift b/Spring/DesignableTextField.swift index 4c2656e..6b83572 100644 --- a/Spring/DesignableTextField.swift +++ b/Spring/DesignableTextField.swift @@ -82,13 +82,13 @@ import UIKit @IBInspectable public var lineHeight: CGFloat = 1.5 { didSet { - var font = UIFont(name: self.font!.fontName, size: self.font!.pointSize) - var text = self.text + let font = UIFont(name: self.font!.fontName, size: self.font!.pointSize) + let text = self.text - var paragraphStyle = NSMutableParagraphStyle() + let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineHeight - var attributedString = NSMutableAttributedString(string: text!) + let attributedString = NSMutableAttributedString(string: text!) attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedString.length)) attributedString.addAttribute(NSFontAttributeName, value: font!, range: NSMakeRange(0, attributedString.length)) diff --git a/Spring/LoadingView.swift b/Spring/LoadingView.swift index a763140..4edb051 100644 --- a/Spring/LoadingView.swift +++ b/Spring/LoadingView.swift @@ -49,7 +49,7 @@ public extension UIView { public func showLoading() { - if let loadingXibView = self.viewWithTag(LoadingViewConstants.Tag) { + if self.viewWithTag(LoadingViewConstants.Tag) != nil { // If loading view is already found in current view hierachy, do nothing return } diff --git a/SpringApp/SpringViewController.swift b/SpringApp/SpringViewController.swift index bfa4c85..108822e 100644 --- a/SpringApp/SpringViewController.swift +++ b/SpringApp/SpringViewController.swift @@ -213,7 +213,7 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView return data[component].count } - func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { + func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return data[component][row] } From a61304a43cd760f678e563c78b50458b1e6320b2 Mon Sep 17 00:00:00 2001 From: Meng To Date: Tue, 9 Jun 2015 10:58:12 -0700 Subject: [PATCH 10/87] Fix for Swift 2 --- Spring/ImageLoader.swift | 2 +- Spring/Misc.swift | 126 +++++++++++++++++++-------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/Spring/ImageLoader.swift b/Spring/ImageLoader.swift index cec5fd6..42645e0 100755 --- a/Spring/ImageLoader.swift +++ b/Spring/ImageLoader.swift @@ -47,7 +47,7 @@ public class ImageLoader { return } - let downloadTask: NSURLSessionTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: { (data, response, error) -> Void in + let downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: { (data, response, error) -> Void in if (error != nil) { completionHandler(image: nil, url: urlString) return diff --git a/Spring/Misc.swift b/Spring/Misc.swift index 84211d7..055e402 100644 --- a/Spring/Misc.swift +++ b/Spring/Misc.swift @@ -151,66 +151,66 @@ public func randomStringWithLength (len : Int) -> NSString { return randomString } -//public func timeAgoSinceDate(date:NSDate, numericDates:Bool) -> String { -// let calendar = NSCalendar.currentCalendar() -// let unitFlags: NSCalendarUnit = [NSCalendarUnit.Minute, NSCalendarUnit.Hour, NSCalendarUnit.Day, NSCalendarUnit.WeekOfYear, NSCalendarUnit.Month, NSCalendarUnit.Year, NSCalendarUnit.Second] -// let now = NSDate() -// let earliest = now.earlierDate(date) -// let latest = (earliest == now) ? date : now -// let components:NSDateComponents = calendar.components(unitFlags, fromDate: earliest, toDate: latest, options: nil) -// -// if (components.year >= 2) { -// return "\(components.year)y" -// } else if (components.year >= 1){ -// if (numericDates){ -// return "1y" -// } else { -// return "1y" -// } -// } else if (components.month >= 2) { -// return "\(components.month * 4)w" -// } else if (components.month >= 1){ -// if (numericDates){ -// return "4w" -// } else { -// return "4w" -// } -// } else if (components.weekOfYear >= 2) { -// return "\(components.weekOfYear)w" -// } else if (components.weekOfYear >= 1){ -// if (numericDates){ -// return "1w" -// } else { -// return "1w" -// } -// } else if (components.day >= 2) { -// return "\(components.day)d" -// } else if (components.day >= 1){ -// if (numericDates){ -// return "1d" -// } else { -// return "1d" -// } -// } else if (components.hour >= 2) { -// return "\(components.hour)h" -// } else if (components.hour >= 1){ -// if (numericDates){ -// return "1h" -// } else { -// return "1h" -// } -// } else if (components.minute >= 2) { -// return "\(components.minute)m" -// } else if (components.minute >= 1){ -// if (numericDates){ -// return "1m" -// } else { -// return "1m" -// } -// } else if (components.second >= 3) { -// return "\(components.second)s" -// } else { -// return "now" -// } -// -//} \ No newline at end of file +public func timeAgoSinceDate(date:NSDate, numericDates:Bool) -> String { + let calendar = NSCalendar.currentCalendar() + let unitFlags: NSCalendarUnit = [NSCalendarUnit.Minute, NSCalendarUnit.Hour, NSCalendarUnit.Day, NSCalendarUnit.WeekOfYear, NSCalendarUnit.Month, NSCalendarUnit.Year, NSCalendarUnit.Second] + let now = NSDate() + let earliest = now.earlierDate(date) + let latest = (earliest == now) ? date : now + let components: NSDateComponents = calendar.components(unitFlags, fromDate: earliest, toDate: latest, options: []) + + if (components.year >= 2) { + return "\(components.year)y" + } else if (components.year >= 1){ + if (numericDates){ + return "1y" + } else { + return "1y" + } + } else if (components.month >= 2) { + return "\(components.month * 4)w" + } else if (components.month >= 1){ + if (numericDates){ + return "4w" + } else { + return "4w" + } + } else if (components.weekOfYear >= 2) { + return "\(components.weekOfYear)w" + } else if (components.weekOfYear >= 1){ + if (numericDates){ + return "1w" + } else { + return "1w" + } + } else if (components.day >= 2) { + return "\(components.day)d" + } else if (components.day >= 1){ + if (numericDates){ + return "1d" + } else { + return "1d" + } + } else if (components.hour >= 2) { + return "\(components.hour)h" + } else if (components.hour >= 1){ + if (numericDates){ + return "1h" + } else { + return "1h" + } + } else if (components.minute >= 2) { + return "\(components.minute)m" + } else if (components.minute >= 1){ + if (numericDates){ + return "1m" + } else { + return "1m" + } + } else if (components.second >= 3) { + return "\(components.second)s" + } else { + return "now" + } + +} \ No newline at end of file From 3f6d324b937ea4cf0f0dad1e00ae050d1fd49ab9 Mon Sep 17 00:00:00 2001 From: Meng To Date: Tue, 9 Jun 2015 11:03:04 -0700 Subject: [PATCH 11/87] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a8322e3..2506c71 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ ![](http://cl.ly/image/3a1r1d3l3D1j/spring-logo.jpg) +## Updated for Swift 2 +This update will be in this branch until Swift 2 is out of beta. + ## Installation Drop in the Spring folder to your Xcode project. From c257a69b0dea35757ef8f966497a367f034ce036 Mon Sep 17 00:00:00 2001 From: Meng To Date: Tue, 9 Jun 2015 11:19:57 -0700 Subject: [PATCH 12/87] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2506c71..1d0023b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![](http://cl.ly/image/3a1r1d3l3D1j/spring-logo.jpg) +![](http://cl.ly/image/012R0D3R3x2g/download/springswift2.jpg) ## Updated for Swift 2 This update will be in this branch until Swift 2 is out of beta. From dea15459d3fdaf5f37ae8f57073e14050d73b772 Mon Sep 17 00:00:00 2001 From: James Tang Date: Mon, 15 Jun 2015 01:00:16 +0800 Subject: [PATCH 13/87] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d0023b..7daf4d6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,11 @@ This update will be in this branch until Swift 2 is out of beta. Drop in the Spring folder to your Xcode project. Or via CocoaPods: -`pod 'Spring', '~> 1.0.3'` +``` +use_frameworks! +pod 'Spring', :git => 'https://github.com/MengTo/Spring.git', :branch => 'swift2' +``` + ## Usage with Storyboard In Identity Inspector, connect the UIView to SpringView Class and set the animation properties in Attribute Inspector. From b4a3589aaa59bed5fc046f1940974d0ed69bdf99 Mon Sep 17 00:00:00 2001 From: Brandon Minch Date: Wed, 24 Jun 2015 15:01:49 -0600 Subject: [PATCH 14/87] Fix right padding on DesignableTextField --- Spring/DesignableTextField.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Spring/DesignableTextField.swift b/Spring/DesignableTextField.swift index 7d70e2b..6a841c3 100644 --- a/Spring/DesignableTextField.swift +++ b/Spring/DesignableTextField.swift @@ -55,7 +55,7 @@ import UIKit @IBInspectable public var rightPadding: CGFloat = 0 { didSet { - var padding = UIView(frame: CGRectMake(0, 0, 0, rightPadding)) + var padding = UIView(frame: CGRectMake(0, 0, rightPadding, 0)) rightViewMode = UITextFieldViewMode.Always rightView = padding From 50b0b08f3f1c2c7b85101028c13ab1d1dac6dc9d Mon Sep 17 00:00:00 2001 From: Jaison Vieira Date: Sun, 28 Jun 2015 04:51:47 -0300 Subject: [PATCH 15/87] Make AutoTextView class public Now it can be used by importing Spring (with CocoaPods). --- Spring/AutoTextView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Spring/AutoTextView.swift b/Spring/AutoTextView.swift index e1b3e31..3abced4 100644 --- a/Spring/AutoTextView.swift +++ b/Spring/AutoTextView.swift @@ -8,8 +8,8 @@ import UIKit -class AutoTextView: UITextView { - override func intrinsicContentSize() -> CGSize { +public class AutoTextView: UITextView { + override public func intrinsicContentSize() -> CGSize { var size = self.sizeThatFits(CGSizeMake(self.frame.size.width, CGFloat.max)) size.width = self.frame.size.width if text.length == 0 { From 8cfcdb2ae36f0a10f463f11cf813ffff52b8af82 Mon Sep 17 00:00:00 2001 From: Meng To Date: Tue, 30 Jun 2015 22:03:07 -0400 Subject: [PATCH 16/87] Update for Xcode 7 beta 2 --- Spring/DesignableTabBarController.swift | 2 +- Spring/Info.plist | 2 +- SpringApp.xcodeproj/project.pbxproj | 11 ++++++++++- .../xcshareddata/xcschemes/Spring.xcscheme | 5 ++++- .../xcshareddata/xcschemes/SpringApp.xcscheme | 5 ++++- SpringApp/Info.plist | 6 +++--- SpringAppTests/Info.plist | 2 +- SpringTests/Info.plist | 2 +- 8 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Spring/DesignableTabBarController.swift b/Spring/DesignableTabBarController.swift index 482d7ca..3dea373 100644 --- a/Spring/DesignableTabBarController.swift +++ b/Spring/DesignableTabBarController.swift @@ -107,7 +107,7 @@ extension UIImage { let context = UIGraphicsGetCurrentContext() as CGContextRef CGContextTranslateCTM(context, 0, self.size.height) CGContextScaleCTM(context, 1.0, -1.0); - CGContextSetBlendMode(context, kCGBlendModeNormal) + CGContextSetBlendMode(context, CGBlendMode.Normal) let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect CGContextClipToMask(context, rect, self.CGImage) diff --git a/Spring/Info.plist b/Spring/Info.plist index bd4db03..d3de8ee 100644 --- a/Spring/Info.plist +++ b/Spring/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - designcode.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/SpringApp.xcodeproj/project.pbxproj b/SpringApp.xcodeproj/project.pbxproj index f0b4814..3bc52d5 100644 --- a/SpringApp.xcodeproj/project.pbxproj +++ b/SpringApp.xcodeproj/project.pbxproj @@ -408,7 +408,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0620; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Meng To"; TargetAttributes = { 1A4FDA321A6E44780099D309 = { @@ -607,6 +607,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "designcode.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -627,6 +628,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "designcode.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -649,6 +651,7 @@ INFOPLIST_FILE = SpringTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jamztang.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SpringApp.app/SpringApp"; }; @@ -664,6 +667,7 @@ INFOPLIST_FILE = SpringTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.jamztang.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SpringApp.app/SpringApp"; }; @@ -689,6 +693,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -753,6 +758,7 @@ INFOPLIST_FILE = SpringApp/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "designcode.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -765,6 +771,7 @@ INFOPLIST_FILE = SpringApp/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "designcode.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -784,6 +791,7 @@ ); INFOPLIST_FILE = SpringAppTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "designcode.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SpringApp.app/SpringApp"; }; @@ -799,6 +807,7 @@ ); INFOPLIST_FILE = SpringAppTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "designcode.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SpringApp.app/SpringApp"; }; diff --git a/SpringApp.xcodeproj/xcshareddata/xcschemes/Spring.xcscheme b/SpringApp.xcodeproj/xcshareddata/xcschemes/Spring.xcscheme index 492fc4d..8066cbf 100644 --- a/SpringApp.xcodeproj/xcshareddata/xcschemes/Spring.xcscheme +++ b/SpringApp.xcodeproj/xcshareddata/xcschemes/Spring.xcscheme @@ -1,6 +1,6 @@ + + + + diff --git a/SpringApp/Info.plist b/SpringApp/Info.plist index f5b3473..01aa7f4 100644 --- a/SpringApp/Info.plist +++ b/SpringApp/Info.plist @@ -2,14 +2,12 @@ - UIViewControllerBasedStatusBarAppearance - CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - designcode.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -38,5 +36,7 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIViewControllerBasedStatusBarAppearance + diff --git a/SpringAppTests/Info.plist b/SpringAppTests/Info.plist index b1fb88b..ba72822 100644 --- a/SpringAppTests/Info.plist +++ b/SpringAppTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - designcode.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/SpringTests/Info.plist b/SpringTests/Info.plist index 609467f..ba72822 100644 --- a/SpringTests/Info.plist +++ b/SpringTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.jamztang.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 2446b6580d6e46930a9f37b46e03ea980b63f412 Mon Sep 17 00:00:00 2001 From: Chen Wei Date: Thu, 9 Jul 2015 12:23:34 +0800 Subject: [PATCH 17/87] async image to placeholder when it is nil --- Spring/AsyncImageView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Spring/AsyncImageView.swift b/Spring/AsyncImageView.swift index 0e20cdf..f3ac178 100644 --- a/Spring/AsyncImageView.swift +++ b/Spring/AsyncImageView.swift @@ -34,7 +34,7 @@ public class AsyncImageView: UIImageView { if let strongSelf = self { dispatch_async(dispatch_get_main_queue(), { () -> Void in if strongSelf.url?.absoluteString == url { - strongSelf.image = image + strongSelf.image = image ?? strongSelf.placeholderImage } }) } From 3f9febe52ba261f34a864ad1eaffa30d6e9442b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 12:56:05 +0200 Subject: [PATCH 18/87] Add AnimationPreset enumeration. --- Spring/Spring.swift | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index d1750fa..3b7d2c5 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -102,6 +102,36 @@ public class Spring : NSObject { private var transform : CGAffineTransform { get { return view.transform } set { view.transform = newValue }} private var alpha: CGFloat { get { return view.alpha } set { view.alpha = newValue } } + enum AnimationPreset: String { + case SlideLeft = "slideLeft" + case SlideRight = "slideRight" + case SlideDown = "slideDown" + case SlideUp = "slideUp" + case SqueezeLeft = "squeezeLeft" + case SqueezeRight = "squeezeRight" + case SqueezeDown = "squeezeDown" + case SqueezeUp = "squeezeUp" + case FadeIn = "fadeIn" + case FadeOut = "fadeOut" + case FadeOutIn = "fadeOutIn" + case FadeInLeft = "fadeInLeft" + case FadeInRight = "fadeInRight" + case FadeInDown = "fadeInDown" + case FadeInUp = "fadeInUp" + case ZoomIn = "zoomIn" + case ZoomOut = "zoomOut" + case Fall = "fall" + case Shake = "shake" + case Pop = "pop" + case FlipX = "flipX" + case FlipY = "flipY" + case Morph = "morph" + case Squeeze = "squeeze" + case Flash = "flash" + case Wobble = "wobble" + case Swing = "swing" + } + func animatePreset() { alpha = 0.99 if animation == "" { From ff9b9949ec3c5979e814cc1b5dd7f0cfe859c7dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 13:17:21 +0200 Subject: [PATCH 19/87] Use enum in switch statement. --- Spring/Spring.swift | 395 ++++++++++++++++++++++---------------------- 1 file changed, 195 insertions(+), 200 deletions(-) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index 3b7d2c5..92312fc 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -134,209 +134,204 @@ public class Spring : NSObject { func animatePreset() { alpha = 0.99 - if animation == "" { - return - } - - switch animation { - case "slideLeft": - x = 300*force - case "slideRight": - x = -300*force - case "slideDown": - y = -300*force - case "slideUp": - y = 300*force - case "squeezeLeft": - x = 300 - scaleX = 3*force - case "squeezeRight": - x = -300 - scaleX = 3*force - case "squeezeDown": - y = -300 - scaleY = 3*force - case "squeezeUp": - y = 300 - scaleY = 3*force - case "fadeIn": - opacity = 0 - case "fadeOut": - animateFrom = false - opacity = 0 - case "fadeOutIn": - let animation = CABasicAnimation() - animation.keyPath = "opacity" - animation.fromValue = 1 - animation.toValue = 0 - animation.timingFunction = getTimingFunction(curve) - animation.duration = CFTimeInterval(duration) - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - animation.autoreverses = true - layer.addAnimation(animation, forKey: "fade") - case "fadeInLeft": - opacity = 0 - x = 300*force - case "fadeInRight": - x = -300*force - opacity = 0 - case "fadeInDown": - y = -300*force - opacity = 0 - case "fadeInUp": - y = 300*force - opacity = 0 - case "zoomIn": - opacity = 0 - scaleX = 2*force - scaleY = 2*force - case "zoomOut": - animateFrom = false - opacity = 0 - scaleX = 2*force - scaleY = 2*force - case "fall": - animateFrom = false - rotate = 15 * CGFloat(M_PI/180) - y = 600*force - case "shake": - let animation = CAKeyframeAnimation() - animation.keyPath = "position.x" - animation.values = [0, 30*force, -30*force, 30*force, 0] - animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - animation.timingFunction = getTimingFunction(curve) - animation.duration = CFTimeInterval(duration) - animation.additive = true - animation.repeatCount = repeatCount - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(animation, forKey: "shake") - case "pop": - let animation = CAKeyframeAnimation() - animation.keyPath = "transform.scale" - animation.values = [0, 0.2*force, -0.2*force, 0.2*force, 0] - animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - animation.timingFunction = getTimingFunction(curve) - animation.duration = CFTimeInterval(duration) - animation.additive = true - animation.repeatCount = repeatCount - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(animation, forKey: "pop") - case "flipX": - rotate = 0 - scaleX = 1 - scaleY = 1 - var perspective = CATransform3DIdentity - perspective.m34 = -1.0 / layer.frame.size.width/2 - - let animation = CABasicAnimation() - animation.keyPath = "transform" - animation.fromValue = NSValue(CATransform3D: - CATransform3DMakeRotation(0, 0, 0, 0)) - animation.toValue = NSValue(CATransform3D: - CATransform3DConcat(perspective, CATransform3DMakeRotation(CGFloat(M_PI), 0, 1, 0))) - animation.duration = CFTimeInterval(duration) - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - animation.timingFunction = getTimingFunction(curve) - layer.addAnimation(animation, forKey: "3d") - case "flipY": - var perspective = CATransform3DIdentity - perspective.m34 = -1.0 / layer.frame.size.width/2 - - let animation = CABasicAnimation() - animation.keyPath = "transform" - animation.fromValue = NSValue(CATransform3D: - CATransform3DMakeRotation(0, 0, 0, 0)) - animation.toValue = NSValue(CATransform3D: - CATransform3DConcat(perspective,CATransform3DMakeRotation(CGFloat(M_PI), 1, 0, 0))) - animation.duration = CFTimeInterval(duration) - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - animation.timingFunction = getTimingFunction(curve) - layer.addAnimation(animation, forKey: "3d") - case "morph": - let morphX = CAKeyframeAnimation() - morphX.keyPath = "transform.scale.x" - morphX.values = [1, 1.3*force, 0.7, 1.3*force, 1] - morphX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - morphX.timingFunction = getTimingFunction(curve) - morphX.duration = CFTimeInterval(duration) - morphX.repeatCount = repeatCount - morphX.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(morphX, forKey: "morphX") - - let morphY = CAKeyframeAnimation() - morphY.keyPath = "transform.scale.y" - morphY.values = [1, 0.7, 1.3*force, 0.7, 1] - morphY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - morphY.timingFunction = getTimingFunction(curve) - morphY.duration = CFTimeInterval(duration) - morphY.repeatCount = repeatCount - morphY.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(morphY, forKey: "morphY") - case "squeeze": - let morphX = CAKeyframeAnimation() - morphX.keyPath = "transform.scale.x" - morphX.values = [1, 1.5*force, 0.5, 1.5*force, 1] - morphX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - morphX.timingFunction = getTimingFunction(curve) - morphX.duration = CFTimeInterval(duration) - morphX.repeatCount = repeatCount - morphX.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(morphX, forKey: "morphX") - - let morphY = CAKeyframeAnimation() - morphY.keyPath = "transform.scale.y" - morphY.values = [1, 0.5, 1, 0.5, 1] - morphY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - morphY.timingFunction = getTimingFunction(curve) - morphY.duration = CFTimeInterval(duration) - morphY.repeatCount = repeatCount - morphY.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(morphY, forKey: "morphY") - case "flash": - let animation = CABasicAnimation() - animation.keyPath = "opacity" - animation.fromValue = 1 - animation.toValue = 0 - animation.duration = CFTimeInterval(duration) - animation.repeatCount = repeatCount * 2.0 - animation.autoreverses = true - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(animation, forKey: "flash") - case "wobble": - let animation = CAKeyframeAnimation() - animation.keyPath = "transform.rotation" - animation.values = [0, 0.3*force, -0.3*force, 0.3*force, 0] - animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - animation.duration = CFTimeInterval(duration) - animation.additive = true - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(animation, forKey: "wobble") - - let x = CAKeyframeAnimation() - x.keyPath = "position.x" - x.values = [0, 30*force, -30*force, 30*force, 0] - x.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - x.timingFunction = getTimingFunction(curve) - x.duration = CFTimeInterval(duration) - x.additive = true - x.repeatCount = repeatCount - x.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(x, forKey: "x") - case "swing": - let animation = CAKeyframeAnimation() - animation.keyPath = "transform.rotation" - animation.values = [0, 0.3*force, -0.3*force, 0.3*force, 0] - animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] - animation.duration = CFTimeInterval(duration) - animation.additive = true - animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) - layer.addAnimation(animation, forKey: "swing") - default: - x = 300 + if let animation = AnimationPreset(rawValue: animation) { + switch animation { + case .SlideLeft: + x = 300*force + case .SlideRight: + x = -300*force + case .SlideDown: + y = -300*force + case .SlideUp: + y = 300*force + case .SqueezeLeft: + x = 300 + scaleX = 3*force + case .SqueezeRight: + x = -300 + scaleX = 3*force + case .SqueezeDown: + y = -300 + scaleY = 3*force + case .SqueezeUp: + y = 300 + scaleY = 3*force + case .FadeIn: + opacity = 0 + case .FadeOut: + animateFrom = false + opacity = 0 + case .FadeOutIn: + let animation = CABasicAnimation() + animation.keyPath = "opacity" + animation.fromValue = 1 + animation.toValue = 0 + animation.timingFunction = getTimingFunction(curve) + animation.duration = CFTimeInterval(duration) + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + animation.autoreverses = true + layer.addAnimation(animation, forKey: "fade") + case .FadeInLeft: + opacity = 0 + x = 300*force + case .FadeInRight: + x = -300*force + opacity = 0 + case .FadeInDown: + y = -300*force + opacity = 0 + case .FadeInUp: + y = 300*force + opacity = 0 + case .ZoomIn: + opacity = 0 + scaleX = 2*force + scaleY = 2*force + case .ZoomOut: + animateFrom = false + opacity = 0 + scaleX = 2*force + scaleY = 2*force + case .Fall: + animateFrom = false + rotate = 15 * CGFloat(M_PI/180) + y = 600*force + case .Shake: + let animation = CAKeyframeAnimation() + animation.keyPath = "position.x" + animation.values = [0, 30*force, -30*force, 30*force, 0] + animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + animation.timingFunction = getTimingFunction(curve) + animation.duration = CFTimeInterval(duration) + animation.additive = true + animation.repeatCount = repeatCount + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(animation, forKey: "shake") + case .Pop: + let animation = CAKeyframeAnimation() + animation.keyPath = "transform.scale" + animation.values = [0, 0.2*force, -0.2*force, 0.2*force, 0] + animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + animation.timingFunction = getTimingFunction(curve) + animation.duration = CFTimeInterval(duration) + animation.additive = true + animation.repeatCount = repeatCount + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(animation, forKey: "pop") + case .FlipX: + rotate = 0 + scaleX = 1 + scaleY = 1 + var perspective = CATransform3DIdentity + perspective.m34 = -1.0 / layer.frame.size.width/2 + + let animation = CABasicAnimation() + animation.keyPath = "transform" + animation.fromValue = NSValue(CATransform3D: + CATransform3DMakeRotation(0, 0, 0, 0)) + animation.toValue = NSValue(CATransform3D: + CATransform3DConcat(perspective, CATransform3DMakeRotation(CGFloat(M_PI), 0, 1, 0))) + animation.duration = CFTimeInterval(duration) + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + animation.timingFunction = getTimingFunction(curve) + layer.addAnimation(animation, forKey: "3d") + case .FlipY: + var perspective = CATransform3DIdentity + perspective.m34 = -1.0 / layer.frame.size.width/2 + + let animation = CABasicAnimation() + animation.keyPath = "transform" + animation.fromValue = NSValue(CATransform3D: + CATransform3DMakeRotation(0, 0, 0, 0)) + animation.toValue = NSValue(CATransform3D: + CATransform3DConcat(perspective,CATransform3DMakeRotation(CGFloat(M_PI), 1, 0, 0))) + animation.duration = CFTimeInterval(duration) + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + animation.timingFunction = getTimingFunction(curve) + layer.addAnimation(animation, forKey: "3d") + case .Morph: + let morphX = CAKeyframeAnimation() + morphX.keyPath = "transform.scale.x" + morphX.values = [1, 1.3*force, 0.7, 1.3*force, 1] + morphX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + morphX.timingFunction = getTimingFunction(curve) + morphX.duration = CFTimeInterval(duration) + morphX.repeatCount = repeatCount + morphX.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(morphX, forKey: "morphX") + + let morphY = CAKeyframeAnimation() + morphY.keyPath = "transform.scale.y" + morphY.values = [1, 0.7, 1.3*force, 0.7, 1] + morphY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + morphY.timingFunction = getTimingFunction(curve) + morphY.duration = CFTimeInterval(duration) + morphY.repeatCount = repeatCount + morphY.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(morphY, forKey: "morphY") + case .Squeeze: + let morphX = CAKeyframeAnimation() + morphX.keyPath = "transform.scale.x" + morphX.values = [1, 1.5*force, 0.5, 1.5*force, 1] + morphX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + morphX.timingFunction = getTimingFunction(curve) + morphX.duration = CFTimeInterval(duration) + morphX.repeatCount = repeatCount + morphX.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(morphX, forKey: "morphX") + + let morphY = CAKeyframeAnimation() + morphY.keyPath = "transform.scale.y" + morphY.values = [1, 0.5, 1, 0.5, 1] + morphY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + morphY.timingFunction = getTimingFunction(curve) + morphY.duration = CFTimeInterval(duration) + morphY.repeatCount = repeatCount + morphY.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(morphY, forKey: "morphY") + case .Flash: + let animation = CABasicAnimation() + animation.keyPath = "opacity" + animation.fromValue = 1 + animation.toValue = 0 + animation.duration = CFTimeInterval(duration) + animation.repeatCount = repeatCount * 2.0 + animation.autoreverses = true + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(animation, forKey: "flash") + case .Wobble: + let animation = CAKeyframeAnimation() + animation.keyPath = "transform.rotation" + animation.values = [0, 0.3*force, -0.3*force, 0.3*force, 0] + animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + animation.duration = CFTimeInterval(duration) + animation.additive = true + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(animation, forKey: "wobble") + + let x = CAKeyframeAnimation() + x.keyPath = "position.x" + x.values = [0, 30*force, -30*force, 30*force, 0] + x.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + x.timingFunction = getTimingFunction(curve) + x.duration = CFTimeInterval(duration) + x.additive = true + x.repeatCount = repeatCount + x.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(x, forKey: "x") + case .Swing: + let animation = CAKeyframeAnimation() + animation.keyPath = "transform.rotation" + animation.values = [0, 0.3*force, -0.3*force, 0.3*force, 0] + animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1] + animation.duration = CFTimeInterval(duration) + animation.additive = true + animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay) + layer.addAnimation(animation, forKey: "swing") + } } } - func getTimingFunction(curve: String) -> CAMediaTimingFunction { switch curve { case "easeIn": From 59fbf0e36fab78cea7447741f1b082659229025d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 13:38:35 +0200 Subject: [PATCH 20/87] Update Example Project. --- Spring/Spring.swift | 2 +- SpringApp/SpringViewController.swift | 68 ++++++++++++++-------------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index 92312fc..c7f6666 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -102,7 +102,7 @@ public class Spring : NSObject { private var transform : CGAffineTransform { get { return view.transform } set { view.transform = newValue }} private var alpha: CGFloat { get { return view.alpha } set { view.alpha = newValue } } - enum AnimationPreset: String { + public enum AnimationPreset: String { case SlideLeft = "slideLeft" case SlideRight = "slideRight" case SlideDown = "slideDown" diff --git a/SpringApp/SpringViewController.swift b/SpringApp/SpringViewController.swift index a401517..712c2da 100644 --- a/SpringApp/SpringViewController.swift +++ b/SpringApp/SpringViewController.swift @@ -98,8 +98,8 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView ballView.y = selectedY ballView.rotate = selectedRotate - ballView.animation = data[0][selectedRow] - ballView.curve = data[1][selectedEasing] + ballView.animation = animations[selectedRow].rawValue + ballView.curve = data[selectedEasing] } func minimizeView(sender: AnyObject) { @@ -115,35 +115,37 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView }) UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.Default, animated: true) } - - var data = [[ - "shake", - "pop", - "morph", - "squeeze", - "wobble", - "swing", - "flipX", - "flipY", - "fall", - "squeezeLeft", - "squeezeRight", - "squeezeDown", - "squeezeUp", - "slideLeft", - "slideRight", - "slideDown", - "slideUp", - "fadeIn", - "fadeOut", - "fadeInLeft", - "fadeInRight", - "fadeInDown", - "fadeInUp", - "zoomIn", - "zoomOut", - "flash", - ], ["spring", "linear", "easeIn", "easeOut", "easeInOut","easeInSine","easeOutSine","easeInOutSine","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack"]] + + let animations: [Spring.AnimationPreset] = [ + .Shake, + .Pop, + .Morph, + .Squeeze, + .Wobble, + .Swing, + .FlipX, + .FlipY, + .Fall, + .SqueezeLeft, + .SqueezeRight, + .SqueezeDown, + .SqueezeUp, + .SlideLeft, + .SlideRight, + .SlideDown, + .SlideUp, + .FadeIn, + .FadeOut, + .FadeInLeft, + .FadeInRight, + .FadeInDown, + .FadeInUp, + .ZoomIn, + .ZoomOut, + .Flash + ] + + var data = ["spring", "linear", "easeIn", "easeOut", "easeInOut","easeInSine","easeOutSine","easeInOutSine","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack"] override func viewDidLoad() { super.viewDidLoad() @@ -210,11 +212,11 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - return data[component].count + return component == 0 ? animations.count : data.count } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { - return data[component][row] + return component == 0 ? animations[row].rawValue : data[row] } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { From e2a89bf2434d221620fce001e39e2e17219f856f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 14:12:11 +0200 Subject: [PATCH 21/87] Add animation curve enumeration. --- Spring/Spring.swift | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index c7f6666..19deb14 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -132,6 +132,38 @@ public class Spring : NSObject { case Swing = "swing" } + public enum AnimationCurve: String { + case EaseIn = "easeIn" + case EaseOut = "easeOut" + case EaseInOut = "easeInOut" + case Linear = "linear" + case Spring = "spring" + case EaseInSine = "easeInSine" + case EaseOutSine = "easeOutSine" + case EaseInOutSine = "easeInOutSine" + case EaseInQuad = "easeInQuad" + case EaseOutQuad = "easeOutQuad" + case EaseInOutQuad = "easeInOutQuad" + case EaseInCubic = "easeInCubic" + case EaseOutCubic = "easeOutCubic" + case EaseInOutCubic = "easeInOutCubic" + case EaseInQuart = "easeInQuart" + case EaseOutQuart = "easeOutQuart" + case EaseInOutQuart = "easeInOutQuart" + case EaseInQuint = "easeInQuint" + case EaseOutQuint = "easeOutQuint" + case EaseInOutQuint = "easeInOutQuint" + case EaseInExpo = "easeInExpo" + case EaseOutExpo = "easeOutExpo" + case EaseInOutExpo = "easeInOutExpo" + case EaseInCirc = "easeInCirc" + case EaseOutCirc = "easeOutCirc" + case EaseInOutCirc = "easeInOutCirc" + case EaseInBack = "easeInBack" + case EaseOutBack = "easeOutBack" + case EaseInOutBack = "easeInOutBack" + } + func animatePreset() { alpha = 0.99 if let animation = AnimationPreset(rawValue: animation) { From 3315e69027dc43c13bdd4c3cff8a46cc7f319098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 14:17:59 +0200 Subject: [PATCH 22/87] Use animation curve enum in switch statement --- Spring/Spring.swift | 124 ++++++++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 61 deletions(-) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index 19deb14..6a9bd54 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -365,69 +365,71 @@ public class Spring : NSObject { } func getTimingFunction(curve: String) -> CAMediaTimingFunction { - switch curve { - case "easeIn": - return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) - case "easeOut": - return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) - case "easeInOut": - return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) - case "linear": - return CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) - case "spring": - return CAMediaTimingFunction(controlPoints: 0.5, 1.1+Float(force/3), 1, 1) - case "easeInSine": - return CAMediaTimingFunction(controlPoints: 0.47, 0, 0.745, 0.715) - case "easeOutSine": - return CAMediaTimingFunction(controlPoints: 0.39, 0.575, 0.565, 1) - case "easeInOutSine": - return CAMediaTimingFunction(controlPoints: 0.445, 0.05, 0.55, 0.95) - case "easeInQuad": - return CAMediaTimingFunction(controlPoints: 0.55, 0.085, 0.68, 0.53) - case "easeOutQuad": - return CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94) - case "easeInOutQuad": - return CAMediaTimingFunction(controlPoints: 0.455, 0.03, 0.515, 0.955) - case "easeInCubic": - return CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19) - case "easeOutCubic": - return CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1) - case "easeInOutCubic": - return CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1) - case "easeInQuart": - return CAMediaTimingFunction(controlPoints: 0.895, 0.03, 0.685, 0.22) - case "easeOutQuart": - return CAMediaTimingFunction(controlPoints: 0.165, 0.84, 0.44, 1) - case "easeInOutQuart": - return CAMediaTimingFunction(controlPoints: 0.77, 0, 0.175, 1) - case "easeInQuint": - return CAMediaTimingFunction(controlPoints: 0.755, 0.05, 0.855, 0.06) - case "easeOutQuint": - return CAMediaTimingFunction(controlPoints: 0.23, 1, 0.32, 1) - case "easeInOutQuint": - return CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1) - case "easeInExpo": - return CAMediaTimingFunction(controlPoints: 0.95, 0.05, 0.795, 0.035) - case "easeOutExpo": - return CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1) - case "easeInOutExpo": - return CAMediaTimingFunction(controlPoints: 1, 0, 0, 1) - case "easeInCirc": - return CAMediaTimingFunction(controlPoints: 0.6, 0.04, 0.98, 0.335) - case "easeOutCirc": - return CAMediaTimingFunction(controlPoints: 0.075, 0.82, 0.165, 1) - case "easeInOutCirc": - return CAMediaTimingFunction(controlPoints: 0.785, 0.135, 0.15, 0.86) - case "easeInBack": - return CAMediaTimingFunction(controlPoints: 0.6, -0.28, 0.735, 0.045) - case "easeOutBack": - return CAMediaTimingFunction(controlPoints: 0.175, 0.885, 0.32, 1.275) - case "easeInOutBack": - return CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55) - default: - return CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) + if let curve = AnimationCurve(rawValue: curve) { + switch curve { + case .EaseIn: + return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) + case .EaseOut: + return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) + case .EaseInOut: + return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + case .Linear: + return CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) + case .Spring: + return CAMediaTimingFunction(controlPoints: 0.5, 1.1+Float(force/3), 1, 1) + case .EaseInSine: + return CAMediaTimingFunction(controlPoints: 0.47, 0, 0.745, 0.715) + case .EaseOutSine: + return CAMediaTimingFunction(controlPoints: 0.39, 0.575, 0.565, 1) + case .EaseInOutSine: + return CAMediaTimingFunction(controlPoints: 0.445, 0.05, 0.55, 0.95) + case .EaseInQuad: + return CAMediaTimingFunction(controlPoints: 0.55, 0.085, 0.68, 0.53) + case .EaseOutQuad: + return CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94) + case .EaseInOutQuad: + return CAMediaTimingFunction(controlPoints: 0.455, 0.03, 0.515, 0.955) + case .EaseInCubic: + return CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19) + case .EaseOutCubic: + return CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1) + case .EaseInOutCubic: + return CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1) + case .EaseInQuart: + return CAMediaTimingFunction(controlPoints: 0.895, 0.03, 0.685, 0.22) + case .EaseOutQuart: + return CAMediaTimingFunction(controlPoints: 0.165, 0.84, 0.44, 1) + case .EaseInOutQuart: + return CAMediaTimingFunction(controlPoints: 0.77, 0, 0.175, 1) + case .EaseInQuint: + return CAMediaTimingFunction(controlPoints: 0.755, 0.05, 0.855, 0.06) + case .EaseOutQuint: + return CAMediaTimingFunction(controlPoints: 0.23, 1, 0.32, 1) + case .EaseInOutQuint: + return CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1) + case .EaseInExpo: + return CAMediaTimingFunction(controlPoints: 0.95, 0.05, 0.795, 0.035) + case .EaseOutExpo: + return CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1) + case .EaseInOutExpo: + return CAMediaTimingFunction(controlPoints: 1, 0, 0, 1) + case .EaseInCirc: + return CAMediaTimingFunction(controlPoints: 0.6, 0.04, 0.98, 0.335) + case .EaseOutCirc: + return CAMediaTimingFunction(controlPoints: 0.075, 0.82, 0.165, 1) + case .EaseInOutCirc: + return CAMediaTimingFunction(controlPoints: 0.785, 0.135, 0.15, 0.86) + case .EaseInBack: + return CAMediaTimingFunction(controlPoints: 0.6, -0.28, 0.735, 0.045) + case .EaseOutBack: + return CAMediaTimingFunction(controlPoints: 0.175, 0.885, 0.32, 1.275) + case .EaseInOutBack: + return CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55) + } } + return CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) } + func getAnimationOptions(curve: String) -> UIViewAnimationOptions { switch curve { case "easeIn": From 9e088ac2c9bac23e38d46db5e6ec997617066c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 14:23:33 +0200 Subject: [PATCH 23/87] Update Example Project. --- SpringApp/SpringViewController.swift | 38 +++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/SpringApp/SpringViewController.swift b/SpringApp/SpringViewController.swift index 712c2da..822907b 100644 --- a/SpringApp/SpringViewController.swift +++ b/SpringApp/SpringViewController.swift @@ -99,7 +99,7 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView ballView.rotate = selectedRotate ballView.animation = animations[selectedRow].rawValue - ballView.curve = data[selectedEasing] + ballView.curve = animationCurves[selectedEasing].rawValue } func minimizeView(sender: AnyObject) { @@ -145,7 +145,37 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView .Flash ] - var data = ["spring", "linear", "easeIn", "easeOut", "easeInOut","easeInSine","easeOutSine","easeInOutSine","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack"] + var animationCurves: [Spring.AnimationCurve] = [ + .EaseIn, + .EaseOut, + .EaseInOut, + .Linear, + .Spring, + .EaseInSine, + .EaseOutSine, + .EaseInOutSine, + .EaseInQuad, + .EaseOutQuad, + .EaseInOutQuad, + .EaseInCubic, + .EaseOutCubic, + .EaseInOutCubic, + .EaseInQuart, + .EaseOutQuart, + .EaseInOutQuart, + .EaseInQuint, + .EaseOutQuint, + .EaseInOutQuint, + .EaseInExpo, + .EaseOutExpo, + .EaseInOutExpo, + .EaseInCirc, + .EaseOutCirc, + .EaseInOutCirc, + .EaseInBack, + .EaseOutBack, + .EaseInOutBack + ] override func viewDidLoad() { super.viewDidLoad() @@ -212,11 +242,11 @@ class SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerView } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - return component == 0 ? animations.count : data.count + return component == 0 ? animations.count : animationCurves.count } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { - return component == 0 ? animations[row].rawValue : data[row] + return component == 0 ? animations[row].rawValue : animationCurves[row].rawValue } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { From a69baf52b04f43eacbbf49d0aa16c433250d4872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 14:30:16 +0200 Subject: [PATCH 24/87] Use animation curve enumueration. --- Spring/Spring.swift | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index 6a9bd54..bb0c120 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -431,20 +431,15 @@ public class Spring : NSObject { } func getAnimationOptions(curve: String) -> UIViewAnimationOptions { - switch curve { - case "easeIn": - return UIViewAnimationOptions.CurveEaseIn - case "easeOut": - return UIViewAnimationOptions.CurveEaseOut - case "easeInOut": - return UIViewAnimationOptions.CurveEaseInOut - case "linear": - return UIViewAnimationOptions.CurveLinear - case "spring": - return UIViewAnimationOptions.CurveLinear - default: - return UIViewAnimationOptions.CurveLinear + if let curve = AnimationCurve(rawValue: curve) { + switch curve { + case .EaseIn: return UIViewAnimationOptions.CurveEaseIn + case .EaseOut: return UIViewAnimationOptions.CurveEaseOut + case .EaseInOut: return UIViewAnimationOptions.CurveEaseInOut + default: break + } } + return UIViewAnimationOptions.CurveLinear } public func animate() { From 5b10d20e8421ad56575df4096a89eb4bb7e637ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 14:39:30 +0200 Subject: [PATCH 25/87] Refactor. --- Spring/Spring.swift | 87 +++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 58 deletions(-) diff --git a/Spring/Spring.swift b/Spring/Spring.swift index bb0c120..9ec4bb2 100644 --- a/Spring/Spring.swift +++ b/Spring/Spring.swift @@ -367,64 +367,35 @@ public class Spring : NSObject { func getTimingFunction(curve: String) -> CAMediaTimingFunction { if let curve = AnimationCurve(rawValue: curve) { switch curve { - case .EaseIn: - return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) - case .EaseOut: - return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) - case .EaseInOut: - return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) - case .Linear: - return CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) - case .Spring: - return CAMediaTimingFunction(controlPoints: 0.5, 1.1+Float(force/3), 1, 1) - case .EaseInSine: - return CAMediaTimingFunction(controlPoints: 0.47, 0, 0.745, 0.715) - case .EaseOutSine: - return CAMediaTimingFunction(controlPoints: 0.39, 0.575, 0.565, 1) - case .EaseInOutSine: - return CAMediaTimingFunction(controlPoints: 0.445, 0.05, 0.55, 0.95) - case .EaseInQuad: - return CAMediaTimingFunction(controlPoints: 0.55, 0.085, 0.68, 0.53) - case .EaseOutQuad: - return CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94) - case .EaseInOutQuad: - return CAMediaTimingFunction(controlPoints: 0.455, 0.03, 0.515, 0.955) - case .EaseInCubic: - return CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19) - case .EaseOutCubic: - return CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1) - case .EaseInOutCubic: - return CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1) - case .EaseInQuart: - return CAMediaTimingFunction(controlPoints: 0.895, 0.03, 0.685, 0.22) - case .EaseOutQuart: - return CAMediaTimingFunction(controlPoints: 0.165, 0.84, 0.44, 1) - case .EaseInOutQuart: - return CAMediaTimingFunction(controlPoints: 0.77, 0, 0.175, 1) - case .EaseInQuint: - return CAMediaTimingFunction(controlPoints: 0.755, 0.05, 0.855, 0.06) - case .EaseOutQuint: - return CAMediaTimingFunction(controlPoints: 0.23, 1, 0.32, 1) - case .EaseInOutQuint: - return CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1) - case .EaseInExpo: - return CAMediaTimingFunction(controlPoints: 0.95, 0.05, 0.795, 0.035) - case .EaseOutExpo: - return CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1) - case .EaseInOutExpo: - return CAMediaTimingFunction(controlPoints: 1, 0, 0, 1) - case .EaseInCirc: - return CAMediaTimingFunction(controlPoints: 0.6, 0.04, 0.98, 0.335) - case .EaseOutCirc: - return CAMediaTimingFunction(controlPoints: 0.075, 0.82, 0.165, 1) - case .EaseInOutCirc: - return CAMediaTimingFunction(controlPoints: 0.785, 0.135, 0.15, 0.86) - case .EaseInBack: - return CAMediaTimingFunction(controlPoints: 0.6, -0.28, 0.735, 0.045) - case .EaseOutBack: - return CAMediaTimingFunction(controlPoints: 0.175, 0.885, 0.32, 1.275) - case .EaseInOutBack: - return CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55) + case .EaseIn: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) + case .EaseOut: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) + case .EaseInOut: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + case .Linear: return CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) + case .Spring: return CAMediaTimingFunction(controlPoints: 0.5, 1.1+Float(force/3), 1, 1) + case .EaseInSine: return CAMediaTimingFunction(controlPoints: 0.47, 0, 0.745, 0.715) + case .EaseOutSine: return CAMediaTimingFunction(controlPoints: 0.39, 0.575, 0.565, 1) + case .EaseInOutSine: return CAMediaTimingFunction(controlPoints: 0.445, 0.05, 0.55, 0.95) + case .EaseInQuad: return CAMediaTimingFunction(controlPoints: 0.55, 0.085, 0.68, 0.53) + case .EaseOutQuad: return CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94) + case .EaseInOutQuad: return CAMediaTimingFunction(controlPoints: 0.455, 0.03, 0.515, 0.955) + case .EaseInCubic: return CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19) + case .EaseOutCubic: return CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1) + case .EaseInOutCubic: return CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1) + case .EaseInQuart: return CAMediaTimingFunction(controlPoints: 0.895, 0.03, 0.685, 0.22) + case .EaseOutQuart: return CAMediaTimingFunction(controlPoints: 0.165, 0.84, 0.44, 1) + case .EaseInOutQuart: return CAMediaTimingFunction(controlPoints: 0.77, 0, 0.175, 1) + case .EaseInQuint: return CAMediaTimingFunction(controlPoints: 0.755, 0.05, 0.855, 0.06) + case .EaseOutQuint: return CAMediaTimingFunction(controlPoints: 0.23, 1, 0.32, 1) + case .EaseInOutQuint: return CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1) + case .EaseInExpo: return CAMediaTimingFunction(controlPoints: 0.95, 0.05, 0.795, 0.035) + case .EaseOutExpo: return CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1) + case .EaseInOutExpo: return CAMediaTimingFunction(controlPoints: 1, 0, 0, 1) + case .EaseInCirc: return CAMediaTimingFunction(controlPoints: 0.6, 0.04, 0.98, 0.335) + case .EaseOutCirc: return CAMediaTimingFunction(controlPoints: 0.075, 0.82, 0.165, 1) + case .EaseInOutCirc: return CAMediaTimingFunction(controlPoints: 0.785, 0.135, 0.15, 0.86) + case .EaseInBack: return CAMediaTimingFunction(controlPoints: 0.6, -0.28, 0.735, 0.045) + case .EaseOutBack: return CAMediaTimingFunction(controlPoints: 0.175, 0.885, 0.32, 1.275) + case .EaseInOutBack: return CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55) } } return CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) From c5abc116943aff27b8d5f0cbc0ffbfda857b48c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Tue, 14 Jul 2015 15:41:14 +0200 Subject: [PATCH 26/87] Fix Xcode 7 beta 3 warnings. --- SpringApp.xcodeproj/project.pbxproj | 16 ---------------- .../xcshareddata/xcschemes/SpringApp.xcscheme | 8 ++++---- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/SpringApp.xcodeproj/project.pbxproj b/SpringApp.xcodeproj/project.pbxproj index 3bc52d5..8ac99e0 100644 --- a/SpringApp.xcodeproj/project.pbxproj +++ b/SpringApp.xcodeproj/project.pbxproj @@ -640,10 +640,6 @@ 1A4FDA511A6E44780099D309 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -660,10 +656,6 @@ 1A4FDA521A6E44780099D309 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); INFOPLIST_FILE = SpringTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -781,10 +773,6 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -801,10 +789,6 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); INFOPLIST_FILE = SpringAppTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "designcode.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme b/SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme index ed9fc4a..d4dc8bd 100644 --- a/SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme +++ b/SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme @@ -51,10 +51,10 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -90,11 +90,11 @@ From fae14d1f1d42156b73720b86363a862e68855206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schneider?= Date: Thu, 16 Jul 2015 08:42:55 +0200 Subject: [PATCH 27/87] Fix damping slider thumb tint color. --- SpringApp/Base.lproj/Main.storyboard | 29 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/SpringApp/Base.lproj/Main.storyboard b/SpringApp/Base.lproj/Main.storyboard index 1b4a473..c651883 100644 --- a/SpringApp/Base.lproj/Main.storyboard +++ b/SpringApp/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -172,19 +172,19 @@