diff --git a/STNumberLabel.xcodeproj/project.pbxproj b/STNumberLabel.xcodeproj/project.pbxproj index 4c96497..c6a7335 100644 --- a/STNumberLabel.xcodeproj/project.pbxproj +++ b/STNumberLabel.xcodeproj/project.pbxproj @@ -13,10 +13,7 @@ EB29E0581BED9B1A002D9DEA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EB29E0571BED9B1A002D9DEA /* Assets.xcassets */; }; EB29E05B1BED9B1A002D9DEA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EB29E0591BED9B1A002D9DEA /* LaunchScreen.storyboard */; }; EB29E0641BED9B5A002D9DEA /* STScrollNumberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB29E0631BED9B5A002D9DEA /* STScrollNumberView.swift */; }; - EB2DE4A81BF07F11000766F8 /* CharacterExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2DE4A71BF07F11000766F8 /* CharacterExtension.swift */; }; EB6F9E4E1BEE594C0097630D /* STNumberLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB6F9E4D1BEE594C0097630D /* STNumberLabel.swift */; }; - EBD69A791BF9BA35000AB73C /* UIViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD69A781BF9BA35000AB73C /* UIViewExtension.swift */; }; - EBDCFEA61BFEF26B0037332B /* STScrollNumberViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBDCFEA51BFEF26B0037332B /* STScrollNumberViewExtension.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -28,10 +25,7 @@ EB29E05A1BED9B1A002D9DEA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; EB29E05C1BED9B1A002D9DEA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; EB29E0631BED9B5A002D9DEA /* STScrollNumberView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = STScrollNumberView.swift; sourceTree = ""; }; - EB2DE4A71BF07F11000766F8 /* CharacterExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CharacterExtension.swift; sourceTree = ""; }; EB6F9E4D1BEE594C0097630D /* STNumberLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = STNumberLabel.swift; sourceTree = ""; }; - EBD69A781BF9BA35000AB73C /* UIViewExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtension.swift; sourceTree = ""; }; - EBDCFEA51BFEF26B0037332B /* STScrollNumberViewExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = STScrollNumberViewExtension.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -87,22 +81,11 @@ EB2DE4A61BF07E6D000766F8 /* STNumberLabel */ = { isa = PBXGroup; children = ( - EB2DE4A91BF07F1F000766F8 /* Extension */, EB29E0621BED9B1F002D9DEA /* Views */, ); name = STNumberLabel; sourceTree = ""; }; - EB2DE4A91BF07F1F000766F8 /* Extension */ = { - isa = PBXGroup; - children = ( - EB2DE4A71BF07F11000766F8 /* CharacterExtension.swift */, - EBD69A781BF9BA35000AB73C /* UIViewExtension.swift */, - EBDCFEA51BFEF26B0037332B /* STScrollNumberViewExtension.swift */, - ); - name = Extension; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -174,9 +157,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - EBD69A791BF9BA35000AB73C /* UIViewExtension.swift in Sources */, - EB2DE4A81BF07F11000766F8 /* CharacterExtension.swift in Sources */, - EBDCFEA61BFEF26B0037332B /* STScrollNumberViewExtension.swift in Sources */, EB29E0531BED9B1A002D9DEA /* ViewController.swift in Sources */, EB29E0641BED9B5A002D9DEA /* STScrollNumberView.swift in Sources */, EB6F9E4E1BEE594C0097630D /* STNumberLabel.swift in Sources */, diff --git a/STNumberLabel/CharacterExtension.swift b/STNumberLabel/CharacterExtension.swift deleted file mode 100644 index 6bf56a6..0000000 --- a/STNumberLabel/CharacterExtension.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// CharacterExtension.swift -// STNumberLabel -// -// Created by DangGu on 15/11/9. -// Copyright © 2015年 Donggu. All rights reserved. -// - -import UIKit - -extension Character { - func intValue() -> Int? { - return Int(String(self)) - } - - func utf8Value() -> UInt8 { - for s in String(self).utf8 { - return s - } - return 0 - } - - func utf16Value() -> UInt16 { - for s in String(self).utf16 { - return s - } - return 0 - } - - func unicodeValue() -> UInt32 { - for s in String(self).unicodeScalars { - return s.value - } - return 0 - } -} - diff --git a/STNumberLabel/STNumberLabel.swift b/STNumberLabel/STNumberLabel.swift index 7e1c22a..1c4be9f 100644 --- a/STNumberLabel/STNumberLabel.swift +++ b/STNumberLabel/STNumberLabel.swift @@ -9,30 +9,39 @@ import UIKit class STNumberLabel: UIView { - - private var digit: Int! - var scrollNumberViews: [STScrollNumberView]! - - internal var font: UIFont! - internal var singleNumberSize: CGSize! - internal var containerView: UIView! - + + private var digit: Int + private var scrollNumberViews = [STScrollNumberView]() + + private let font: UIFont + private let singleNumberSize: CGSize + private var containerView: UIView! + init(frame: CGRect, digit: Int, font: UIFont, singleNumberSize: CGSize) { self.digit = digit self.font = font self.singleNumberSize = singleNumberSize + super.init(frame: frame) - setupScrollNumberView() + self.containerView = setupScrollNumberView() } - + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension STNumberLabel { + func scrollToNumber(number: Int) { + let numberString = String(number) let newDigit = numberString.characters.count var numberArray: [Int] = [] - numberString.characters.forEach { (character) -> () in - guard let intNumber = character.intValue() else { return } + numberString.characters.forEach { character in + guard let intNumber = Int(String(character)) else { return } numberArray.append(intNumber) } @@ -42,41 +51,45 @@ class STNumberLabel: UIView { scrollNumberView.scrollToNumber(numberArray[i]) } } else { + let diff = newDigit - digit - let translate = CGFloat(diff) * (singleNumberSize!.width / 2) - - UIView.animateWithDuration(0.33, animations: { [unowned self]() -> Void in - self.containerView!.center = CGPoint(x: self.containerView!.center.x + translate, y: self.containerView!.center.y) - }, completion: { (finished) -> Void in - if finished { - self.constructNewContainerView(newDigit: newDigit, diff: diff, numberArray: numberArray) - } + let translate = CGFloat(diff) * (singleNumberSize.width / 2) + + UIView.animateWithDuration(0.33, animations: { [unowned self] in + self.containerView.center = CGPoint(x: self.containerView.center.x + translate, y: self.containerView.center.y) + + }, completion: { _ in + self.constructNewContainerView(newDigit: newDigit, diff: diff, numberArray: numberArray) }) } - + } // MARK: - helper - private func setupScrollNumberView() { + private func setupScrollNumberView() -> UIView { + let containerViewFrame = CGRect(origin: CGPointZero, size: CGSize(width: CGFloat(digit) * singleNumberSize.width, height: singleNumberSize.height)) - containerView = UIView(frame: containerViewFrame) - containerView.center = absoluteCenter - - scrollNumberViews = [] + let containerView = UIView(frame: containerViewFrame) + containerView.center = CGPoint(x: frame.width / 2, y: frame.height / 2) + for i in 0.. Void in + + UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveLinear, animations: { [unowned self] in + newContainerView.alpha = 1.0 self.containerView.alpha = 0.0 - }) { [unowned self](finished) -> Void in - self.containerView.removeFromSuperview() - self.containerView = newContainerView - self.scrollNumberViews = newSrollNumberView - self.digit = newDigit - - for i in 0.. 10 { + if number < 0 || number > 10 { scrollToNumber(0) return } + if number == currentNumber { return } + currentNumber = number - UIView.animateWithDuration(1.0, delay: 0.0, options: .CurveEaseOut, - animations: { [weak self]() -> Void in - guard let weakSelf = self else {return} - weakSelf.scrollView.setContentOffset(CGPoint(x: 0, y: weakSelf.height*CGFloat(weakSelf.numberIndex[number])), animated: false) - }, completion: nil) + + UIView.animateWithDuration(1.0, delay: 0.0, options: .CurveEaseOut, animations: { [unowned self] in + self.scrollView.setContentOffset(CGPoint(x: 0, y: self.frame.height * CGFloat(self.numberIndex[number])), animated: false) + }, completion: nil) } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) + +} + +extension STScrollNumberView { + func deepCopy() -> STScrollNumberView { + return STScrollNumberView(frame: frame, font: font, number: currentNumber) } } diff --git a/STNumberLabel/STScrollNumberViewExtension.swift b/STNumberLabel/STScrollNumberViewExtension.swift deleted file mode 100644 index 3d905e5..0000000 --- a/STNumberLabel/STScrollNumberViewExtension.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// STScrollNumberViewExtension.swift -// STNumberLabel -// -// Created by DangGu on 15/11/20. -// Copyright © 2015年 Donggu. All rights reserved. -// - -import Foundation - -extension STScrollNumberView { - func deepCopy() -> STScrollNumberView { - return STScrollNumberView(frame: frame, font: font, number: currentNumber) - } -} \ No newline at end of file diff --git a/STNumberLabel/UIViewExtension.swift b/STNumberLabel/UIViewExtension.swift deleted file mode 100644 index 0ea1e5c..0000000 --- a/STNumberLabel/UIViewExtension.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// UIViewExtension.swift -// STNumberLabel -// -// Created by DangGu on 15/11/16. -// Copyright © 2015年 Donggu. All rights reserved. -// - -import UIKit - -extension UIView { - var width: CGFloat { - get { - return CGRectGetWidth(frame) - } - } - - var height: CGFloat { - get { - return CGRectGetHeight(frame) - } - } - - var minX: CGFloat { - get { - return CGRectGetMinX(frame) - } - } - - var minY: CGFloat { - get { - return CGRectGetMinY(frame) - } - } - - var maxX: CGFloat { - get { - return CGRectGetMaxX(frame) - } - } - - var maxY: CGFloat { - get { - return CGRectGetMaxY(frame) - } - } - - var absoluteCenter: CGPoint { - get { - return CGPoint(x: width / 2, y: height / 2) - } - } -} \ No newline at end of file diff --git a/STNumberLabel/ViewController.swift b/STNumberLabel/ViewController.swift index baf2bff..67ab242 100644 --- a/STNumberLabel/ViewController.swift +++ b/STNumberLabel/ViewController.swift @@ -16,7 +16,7 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() numberlabel = STNumberLabel(frame: CGRectMake(150, 200, 200, 50), digit: 4, font: UIFont.systemFontOfSize(22.0), singleNumberSize: CGSize(width: 20, height: 50)) - numberlabel.center = CGPoint(x: view.width / 2, y: 200) + numberlabel.center = CGPoint(x: view.frame.width / 2, y: 200) view.addSubview(numberlabel); }