Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 0 additions & 20 deletions STNumberLabel.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -28,10 +25,7 @@
EB29E05A1BED9B1A002D9DEA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
EB29E05C1BED9B1A002D9DEA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
EB29E0631BED9B5A002D9DEA /* STScrollNumberView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = STScrollNumberView.swift; sourceTree = "<group>"; };
EB2DE4A71BF07F11000766F8 /* CharacterExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CharacterExtension.swift; sourceTree = "<group>"; };
EB6F9E4D1BEE594C0097630D /* STNumberLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = STNumberLabel.swift; sourceTree = "<group>"; };
EBD69A781BF9BA35000AB73C /* UIViewExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtension.swift; sourceTree = "<group>"; };
EBDCFEA51BFEF26B0037332B /* STScrollNumberViewExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = STScrollNumberViewExtension.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -87,22 +81,11 @@
EB2DE4A61BF07E6D000766F8 /* STNumberLabel */ = {
isa = PBXGroup;
children = (
EB2DE4A91BF07F1F000766F8 /* Extension */,
EB29E0621BED9B1F002D9DEA /* Views */,
);
name = STNumberLabel;
sourceTree = "<group>";
};
EB2DE4A91BF07F1F000766F8 /* Extension */ = {
isa = PBXGroup;
children = (
EB2DE4A71BF07F11000766F8 /* CharacterExtension.swift */,
EBD69A781BF9BA35000AB73C /* UIViewExtension.swift */,
EBDCFEA51BFEF26B0037332B /* STScrollNumberViewExtension.swift */,
);
name = Extension;
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
Expand Down Expand Up @@ -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 */,
Expand Down
37 changes: 0 additions & 37 deletions STNumberLabel/CharacterExtension.swift

This file was deleted.

104 changes: 58 additions & 46 deletions STNumberLabel/STNumberLabel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand All @@ -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..<digit {
let numberFrame = CGRect(x: CGFloat(i)*singleNumberSize.width, y: 0, width: singleNumberSize.width, height: singleNumberSize.height)
let scrollNumberView = STScrollNumberView(frame: numberFrame, font: font)
scrollNumberViews.append(scrollNumberView)
containerView.addSubview(scrollNumberView)
}

addSubview(containerView)

return containerView
}

private func constructNewContainerView(newDigit newDigit: Int, diff: Int, numberArray: [Int]) {

let newContainerViewFrame = CGRect(origin: CGPointZero, size: CGSize(width: CGFloat(newDigit) * singleNumberSize.width, height: singleNumberSize.height))

let newContainerView = UIView(frame: newContainerViewFrame)
newContainerView.center = absoluteCenter
newContainerView.center = CGPoint(x: frame.width / 2, y: frame.height / 2)
newContainerView.alpha = 0.0

var newSrollNumberView: [STScrollNumberView] = []
Expand Down Expand Up @@ -105,27 +118,26 @@ class STNumberLabel: UIView {
newContainerView.addSubview(scrollNumberView)
}
}


addSubview(newContainerView)

UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveLinear, animations: { [unowned self]() -> 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..<self.scrollNumberViews.count {
let scrollNumberView: STScrollNumberView = self.scrollNumberViews[i]
scrollNumberView.scrollToNumber(numberArray[i])
}
}
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")

}, completion: { _ in

self.containerView.removeFromSuperview()
self.containerView = newContainerView
self.scrollNumberViews = newSrollNumberView
self.digit = newDigit

for i in 0..<self.scrollNumberViews.count {
let scrollNumberView: STScrollNumberView = self.scrollNumberViews[i]
scrollNumberView.scrollToNumber(numberArray[i])
}

})
}
}
55 changes: 34 additions & 21 deletions STNumberLabel/STScrollNumberView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,52 +9,65 @@
import UIKit

class STScrollNumberView: UIView {
var scrollView: UIScrollView!
var currentNumber = 0
var font: UIFont!
let numberIndex: [Int] = [9,8,7,6,5,4,3,2,1,0]

private let scrollView: UIScrollView
private var currentNumber = 0
private let font: UIFont
private let numberIndex: [Int] = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

init(frame: CGRect, font: UIFont, number: Int) {

self.font = font
self.currentNumber = number
self.scrollView = UIScrollView(frame: CGRect(origin: CGPointZero, size: frame.size))

super.init(frame: frame)
scrollView = UIScrollView(frame: bounds)
scrollView.contentSize = CGSize(width: self.width, height: self.height*10)

scrollView.contentSize = CGSize(width: frame.width, height: frame.height * 10)

for i in 0..<10 {
let numberFrame = CGRectMake(0, height*CGFloat(i), width, height)
let numberFrame = CGRectMake(0, frame.height * CGFloat(i), frame.width, frame.height)
let label = UILabel(frame: numberFrame)
label.text = "\(numberIndex[i])"
label.textAlignment = NSTextAlignment.Center
label.font = font
scrollView.addSubview(label)
}
scrollView.contentOffset = CGPoint(x: 0, y: height*CGFloat(numberIndex[currentNumber]))


scrollView.contentOffset = CGPoint(x: 0, y: frame.height * CGFloat(numberIndex[currentNumber]))

addSubview(scrollView)
}

convenience init(frame: CGRect, font: UIFont) {
self.init(frame: frame, font: font, number: 0)
}


required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

func scrollToNumber(number: NSInteger) {
if number<0 || number > 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)
}
}
15 changes: 0 additions & 15 deletions STNumberLabel/STScrollNumberViewExtension.swift

This file was deleted.

Loading