on master help sign in
10 files changed+218−202
since splitsnapshots
unifiedsplit
.swift-version+1 GMStepper.podspec+2−2 GMStepper/GMStepper.swift+40−28 GMStepperExample/GMStepperExample.xcodeproj/project.pbxproj+124−120 GMStepperExample/GMStepperExample/AppDelegate.swift+10−10 GMStepperExample/GMStepperExample/Base.lproj/Main.storyboard+30−34 GMStepperExample/GMStepperExample/ViewController.swift+1−1 GMStepperExample/GMStepperExampleTests/GMStepperExampleTests.swift+3−3 GMStepperExample/GMStepperExampleTests/Info.plist−2 README.md+7−2
.swift-versionnew file+1
@@ -0,0 +1 @@
1+4.0
GMStepper.podspec+2−2
@@ -1,9 +1,9 @@
11Pod::Spec.new do |s|
22 s.name = "GMStepper"
3− s.version = "1.2.0"
3+ s.version = "2.1"
44 s.summary = "A stepper with a sliding label in the middle."
55 s.homepage = "https://github.com/gmertk/GMStepper"
6− s.screenshots = "https://dl.dropboxusercontent.com/u/4397140/pod-screenshots/screenshot_1.png"
6+ s.screenshots = "https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.gif"
77 s.license = 'MIT'
88 s.author = { "Gunay Mert Karadogan" => "mertkaradogan@gmail.com" }
99 s.source = { :git => "https://github.com/gmertk/GMStepper.git", :tag => s.version.to_s }
GMStepper/GMStepper.swift+40−28
@@ -11,7 +11,7 @@ import UIKit
1111@IBDesignable public class GMStepper: UIControl {
1212
1313 /// Current value of the stepper. Defaults to 0.
14− @IBInspectable public var value: Double = 0 {
14+ @objc @IBInspectable public var value: Double = 0 {
1515 didSet {
1616 value = min(maximumValue, max(minimumValue, value))
1717
@@ -37,44 +37,44 @@ import UIKit
3737 }
3838
3939 /// Minimum value. Must be less than maximumValue. Defaults to 0.
40− @IBInspectable public var minimumValue: Double = 0 {
40+ @objc @IBInspectable public var minimumValue: Double = 0 {
4141 didSet {
4242 value = min(maximumValue, max(minimumValue, value))
4343 }
4444 }
4545
4646 /// Maximum value. Must be more than minimumValue. Defaults to 100.
47− @IBInspectable public var maximumValue: Double = 100 {
47+ @objc @IBInspectable public var maximumValue: Double = 100 {
4848 didSet {
4949 value = min(maximumValue, max(minimumValue, value))
5050 }
5151 }
5252
5353 /// Step/Increment value as in UIStepper. Defaults to 1.
54− @IBInspectable public var stepValue: Double = 1
54+ @objc @IBInspectable public var stepValue: Double = 1
5555
5656 /// The same as UIStepper's autorepeat. If true, holding on the buttons or keeping the pan gesture alters the value repeatedly. Defaults to true.
57− @IBInspectable public var autorepeat: Bool = true
57+ @objc @IBInspectable public var autorepeat: Bool = true
5858
5959 /// If the value is integer, it is shown without floating point.
60− @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
60+ @objc @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
6161
6262 /// Text on the left button. Be sure that it fits in the button. Defaults to "−".
63− @IBInspectable public var leftButtonText: String = "−" {
63+ @objc @IBInspectable public var leftButtonText: String = "−" {
6464 didSet {
6565 leftButton.setTitle(leftButtonText, for: .normal)
6666 }
6767 }
6868
6969 /// Text on the right button. Be sure that it fits in the button. Defaults to "+".
70− @IBInspectable public var rightButtonText: String = "+" {
70+ @objc @IBInspectable public var rightButtonText: String = "+" {
7171 didSet {
7272 rightButton.setTitle(rightButtonText, for: .normal)
7373 }
7474 }
7575
7676 /// Text color of the buttons. Defaults to white.
77− @IBInspectable public var buttonsTextColor: UIColor = UIColor.white {
77+ @objc @IBInspectable public var buttonsTextColor: UIColor = UIColor.white {
7878 didSet {
7979 for button in [leftButton, rightButton] {
8080 button.setTitleColor(buttonsTextColor, for: .normal)
@@ -83,7 +83,7 @@ import UIKit
8383 }
8484
8585 /// Background color of the buttons. Defaults to dark blue.
86− @IBInspectable public var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1) {
86+ @objc @IBInspectable public var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1) {
8787 didSet {
8888 for button in [leftButton, rightButton] {
8989 button.backgroundColor = buttonsBackgroundColor
@@ -93,7 +93,7 @@ import UIKit
9393 }
9494
9595 /// Font of the buttons. Defaults to AvenirNext-Bold, 20.0 points in size.
96− public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
96+ @objc public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
9797 didSet {
9898 for button in [leftButton, rightButton] {
9999 button.titleLabel?.font = buttonsFont
@@ -102,28 +102,35 @@ import UIKit
102102 }
103103
104104 /// Text color of the middle label. Defaults to white.
105− @IBInspectable public var labelTextColor: UIColor = UIColor.white {
105+ @objc @IBInspectable public var labelTextColor: UIColor = UIColor.white {
106106 didSet {
107107 label.textColor = labelTextColor
108108 }
109109 }
110110
111111 /// Text color of the middle label. Defaults to lighter blue.
112− @IBInspectable public var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1) {
112+ @objc @IBInspectable public var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1) {
113113 didSet {
114114 label.backgroundColor = labelBackgroundColor
115115 }
116116 }
117117
118118 /// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
119− public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
119+ @objc public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
120120 didSet {
121121 label.font = labelFont
122122 }
123123 }
124+ /// Corner radius of the middle label. Defaults to 0.
125+ @objc @IBInspectable public var labelCornerRadius: CGFloat = 0 {
126+ didSet {
127+ label.layer.cornerRadius = labelCornerRadius
128+
129+ }
130+ }
124131
125132 /// Corner radius of the stepper's layer. Defaults to 4.0.
126− @IBInspectable public var cornerRadius: CGFloat = 4.0 {
133+ @objc @IBInspectable public var cornerRadius: CGFloat = 4.0 {
127134 didSet {
128135 layer.cornerRadius = cornerRadius
129136 clipsToBounds = true
@@ -131,7 +138,7 @@ import UIKit
131138 }
132139
133140 /// Border width of the stepper and middle label's layer. Defaults to 0.0.
134− @IBInspectable public var borderWidth: CGFloat = 0.0 {
141+ @objc @IBInspectable public var borderWidth: CGFloat = 0.0 {
135142 didSet {
136143 layer.borderWidth = borderWidth
137144 label.layer.borderWidth = borderWidth
@@ -139,7 +146,7 @@ import UIKit
139146 }
140147
141148 /// Color of the border of the stepper and middle label's layer. Defaults to clear color.
142− @IBInspectable public var borderColor: UIColor = UIColor.clear {
149+ @objc @IBInspectable public var borderColor: UIColor = UIColor.clear {
143150 didSet {
144151 layer.borderColor = borderColor.cgColor
145152 label.layer.borderColor = borderColor.cgColor
@@ -147,7 +154,7 @@ import UIKit
147154 }
148155
149156 /// Percentage of the middle label's width. Must be between 0 and 1. Defaults to 0.5. Be sure that it is wide enough to show the value.
150− @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
157+ @objc @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
151158 didSet {
152159 labelWidthWeight = min(1, max(0, labelWidthWeight))
153160 setNeedsLayout()
@@ -155,7 +162,7 @@ import UIKit
155162 }
156163
157164 /// Color of the flashing animation on the buttons in case the value hit the limit.
158− @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
165+ @objc @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
159166
160167 /**
161168 Width of the sliding animation. When buttons clicked, the middle label does a slide animation towards to the clicked button. Defaults to 5.
@@ -177,6 +184,7 @@ import UIKit
177184 button.addTarget(self, action: #selector(GMStepper.leftButtonTouchDown), for: .touchDown)
178185 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
179186 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
187+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
180188 return button
181189 }()
182190
@@ -189,6 +197,7 @@ import UIKit
189197 button.addTarget(self, action: #selector(GMStepper.rightButtonTouchDown), for: .touchDown)
190198 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
191199 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
200+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
192201 return button
193202 }()
194203
@@ -203,6 +212,8 @@ import UIKit
203212 label.textColor = self.labelTextColor
204213 label.backgroundColor = self.labelBackgroundColor
205214 label.font = self.labelFont
215+ label.layer.cornerRadius = self.labelCornerRadius
216+ label.layer.masksToBounds = true
206217 label.isUserInteractionEnabled = true
207218 let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(GMStepper.handlePan))
208219 panRecognizer.maximumNumberOfTouches = 1
@@ -234,7 +245,7 @@ import UIKit
234245 }
235246
236247
237− public var items : [String] = [] {
248+ @objc public var items : [String] = [] {
238249 didSet {
239250 let isInteger = floor(value) == value
240251
@@ -280,12 +291,12 @@ import UIKit
280291 }
281292 }
282293
283− required public init?(coder aDecoder: NSCoder) {
294+ @objc required public init?(coder aDecoder: NSCoder) {
284295 super.init(coder: aDecoder)
285296 setup()
286297 }
287298
288− public override init(frame: CGRect) {
299+ @objc public override init(frame: CGRect) {
289300 super.init(frame: frame)
290301 setup()
291302 }
@@ -298,6 +309,7 @@ import UIKit
298309 backgroundColor = buttonsBackgroundColor
299310 layer.cornerRadius = cornerRadius
300311 clipsToBounds = true
312+ labelOriginalCenter = label.center
301313
302314 NotificationCenter.default.addObserver(self, selector: #selector(GMStepper.reset), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
303315 }
@@ -344,7 +356,7 @@ import UIKit
344356
345357// MARK: Pan Gesture
346358extension GMStepper {
347− func handlePan(gesture: UIPanGestureRecognizer) {
359+ @objc func handlePan(gesture: UIPanGestureRecognizer) {
348360 switch gesture.state {
349361 case .began:
350362 leftButton.isEnabled = false
@@ -394,7 +406,7 @@ extension GMStepper {
394406 }
395407 }
396408
397− func reset() {
409+ @objc func reset() {
398410 panState = .Stable
399411 stepperState = .Stable
400412 resetTimer()
@@ -413,7 +425,7 @@ extension GMStepper {
413425
414426// MARK: Button Events
415427extension GMStepper {
416− func leftButtonTouchDown(button: UIButton) {
428+ @objc func leftButtonTouchDown(button: UIButton) {
417429 rightButton.isEnabled = false
418430 label.isUserInteractionEnabled = false
419431 resetTimer()
@@ -427,7 +439,7 @@ extension GMStepper {
427439
428440 }
429441
430− func rightButtonTouchDown(button: UIButton) {
442+ @objc func rightButtonTouchDown(button: UIButton) {
431443 leftButton.isEnabled = false
432444 label.isUserInteractionEnabled = false
433445 resetTimer()
@@ -440,7 +452,7 @@ extension GMStepper {
440452 }
441453 }
442454
443− func buttonTouchUp(button: UIButton) {
455+ @objc func buttonTouchUp(button: UIButton) {
444456 reset()
445457 }
446458}
@@ -485,7 +497,7 @@ extension GMStepper {
485497
486498// MARK: Timer
487499extension GMStepper {
488− func handleTimerFire(timer: Timer) {
500+ @objc func handleTimerFire(timer: Timer) {
489501 timerFireCount += 1
490502
491503 if timerFireCount % timerFireCountModulo == 0 {
GMStepperExample/GMStepperExample.xcodeproj/project.pbxproj+124−120
@@ -7,18 +7,18 @@
77 objects = {
88
99/* Begin PBXBuildFile section */
10− 3169DD3E1B496C33009791D1 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
10+ 3116C0DB1DA4DD360015AC69 /* GMStepperExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3116C0DA1DA4DD360015AC69 /* GMStepperExampleTests.swift */; };
11+ 3198AC771DA4DEE500311FB3 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
1112 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19371B4843EB005EFEE5 /* AppDelegate.swift */; };
1213 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19391B4843EB005EFEE5 /* ViewController.swift */; };
1314 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 319C193B1B4843EB005EFEE5 /* Main.storyboard */; };
1415 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 319C193E1B4843EB005EFEE5 /* Images.xcassets */; };
1516 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 319C19401B4843EB005EFEE5 /* LaunchScreen.xib */; };
16− 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */; };
1717 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
1818/* End PBXBuildFile section */
1919
2020/* Begin PBXContainerItemProxy section */
21− 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */ = {
21+ 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */ = {
2222 isa = PBXContainerItemProxy;
2323 containerPortal = 319C192A1B4843EB005EFEE5 /* Project object */;
2424 proxyType = 1;
@@ -28,6 +28,9 @@
2828/* End PBXContainerItemProxy section */
2929
3030/* Begin PBXFileReference section */
31+ 3116C0D81DA4DD360015AC69 /* GMStepperExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GMStepperExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
32+ 3116C0DA1DA4DD360015AC69 /* GMStepperExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GMStepperExampleTests.swift; sourceTree = "<group>"; };
33+ 3116C0DC1DA4DD360015AC69 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3134 319C19321B4843EB005EFEE5 /* GMStepperExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GMStepperExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
3235 319C19361B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3336 319C19371B4843EB005EFEE5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -35,21 +38,18 @@
3538 319C193C1B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
3639 319C193E1B4843EB005EFEE5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
3740 319C19411B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
38− 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GMStepperExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
39− 319C194C1B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
40− 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GMStepperExampleTests.swift; sourceTree = "<group>"; };
4141 319C195B1B48445E005EFEE5 /* GMStepper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GMStepper.swift; sourceTree = "<group>"; };
4242/* End PBXFileReference section */
4343
4444/* Begin PBXFrameworksBuildPhase section */
45− 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
45+ 3116C0D51DA4DD360015AC69 /* Frameworks */ = {
4646 isa = PBXFrameworksBuildPhase;
4747 buildActionMask = 2147483647;
4848 files = (
4949 );
5050 runOnlyForDeploymentPostprocessing = 0;
5151 };
52− 319C19441B4843EB005EFEE5 /* Frameworks */ = {
52+ 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
5353 isa = PBXFrameworksBuildPhase;
5454 buildActionMask = 2147483647;
5555 files = (
@@ -59,12 +59,21 @@
5959/* End PBXFrameworksBuildPhase section */
6060
6161/* Begin PBXGroup section */
62+ 3116C0D91DA4DD360015AC69 /* GMStepperExampleTests */ = {
63+ isa = PBXGroup;
64+ children = (
65+ 3116C0DA1DA4DD360015AC69 /* GMStepperExampleTests.swift */,
66+ 3116C0DC1DA4DD360015AC69 /* Info.plist */,
67+ );
68+ path = GMStepperExampleTests;
69+ sourceTree = "<group>";
70+ };
6271 319C19291B4843EB005EFEE5 = {
6372 isa = PBXGroup;
6473 children = (
6574 319C195A1B48445E005EFEE5 /* GMStepper */,
6675 319C19341B4843EB005EFEE5 /* GMStepperExample */,
67− 319C194A1B4843EB005EFEE5 /* GMStepperExampleTests */,
76+ 3116C0D91DA4DD360015AC69 /* GMStepperExampleTests */,
6877 319C19331B4843EB005EFEE5 /* Products */,
6978 );
7079 sourceTree = "<group>";
@@ -73,7 +82,7 @@
7382 isa = PBXGroup;
7483 children = (
7584 319C19321B4843EB005EFEE5 /* GMStepperExample.app */,
76− 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */,
85+ 3116C0D81DA4DD360015AC69 /* GMStepperExampleTests.xctest */,
7786 );
7887 name = Products;
7988 sourceTree = "<group>";
@@ -99,23 +108,6 @@
99108 name = "Supporting Files";
100109 sourceTree = "<group>";
101110 };
102− 319C194A1B4843EB005EFEE5 /* GMStepperExampleTests */ = {
103− isa = PBXGroup;
104− children = (
105− 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */,
106− 319C194B1B4843EB005EFEE5 /* Supporting Files */,
107− );
108− path = GMStepperExampleTests;
109− sourceTree = "<group>";
110− };
111− 319C194B1B4843EB005EFEE5 /* Supporting Files */ = {
112− isa = PBXGroup;
113− children = (
114− 319C194C1B4843EB005EFEE5 /* Info.plist */,
115− );
116− name = "Supporting Files";
117− sourceTree = "<group>";
118− };
119111 319C195A1B48445E005EFEE5 /* GMStepper */ = {
120112 isa = PBXGroup;
121113 children = (
@@ -128,6 +120,24 @@
128120/* End PBXGroup section */
129121
130122/* Begin PBXNativeTarget section */
123+ 3116C0D71DA4DD360015AC69 /* GMStepperExampleTests */ = {
124+ isa = PBXNativeTarget;
125+ buildConfigurationList = 3116C0DF1DA4DD360015AC69 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */;
126+ buildPhases = (
127+ 3116C0D41DA4DD360015AC69 /* Sources */,
128+ 3116C0D51DA4DD360015AC69 /* Frameworks */,
129+ 3116C0D61DA4DD360015AC69 /* Resources */,
130+ );
131+ buildRules = (
132+ );
133+ dependencies = (
134+ 3116C0DE1DA4DD360015AC69 /* PBXTargetDependency */,
135+ );
136+ name = GMStepperExampleTests;
137+ productName = GMStepperExampleTests;
138+ productReference = 3116C0D81DA4DD360015AC69 /* GMStepperExampleTests.xctest */;
139+ productType = "com.apple.product-type.bundle.unit-test";
140+ };
131141 319C19311B4843EB005EFEE5 /* GMStepperExample */ = {
132142 isa = PBXNativeTarget;
133143 buildConfigurationList = 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */;
@@ -145,24 +155,6 @@
145155 productReference = 319C19321B4843EB005EFEE5 /* GMStepperExample.app */;
146156 productType = "com.apple.product-type.application";
147157 };
148− 319C19461B4843EB005EFEE5 /* GMStepperExampleTests */ = {
149− isa = PBXNativeTarget;
150− buildConfigurationList = 319C19541B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */;
151− buildPhases = (
152− 319C19431B4843EB005EFEE5 /* Sources */,
153− 319C19441B4843EB005EFEE5 /* Frameworks */,
154− 319C19451B4843EB005EFEE5 /* Resources */,
155− );
156− buildRules = (
157− );
158− dependencies = (
159− 319C19491B4843EB005EFEE5 /* PBXTargetDependency */,
160− );
161− name = GMStepperExampleTests;
162− productName = GMStepperExampleTests;
163− productReference = 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */;
164− productType = "com.apple.product-type.bundle.unit-test";
165− };
166158/* End PBXNativeTarget section */
167159
168160/* Begin PBXProject section */
@@ -170,20 +162,20 @@
170162 isa = PBXProject;
171163 attributes = {
172164 LastSwiftMigration = 0700;
173− LastSwiftUpdateCheck = 0700;
174− LastUpgradeCheck = 0800;
165+ LastSwiftUpdateCheck = 0800;
166+ LastUpgradeCheck = 0900;
175167 ORGANIZATIONNAME = "Gunay Mert Karadogan";
176168 TargetAttributes = {
177− 319C19311B4843EB005EFEE5 = {
178− CreatedOnToolsVersion = 6.4;
179− DevelopmentTeam = 289M6XEDV4;
180− LastSwiftMigration = 0800;
169+ 3116C0D71DA4DD360015AC69 = {
170+ CreatedOnToolsVersion = 8.0;
171+ LastSwiftMigration = 0900;
172+ ProvisioningStyle = Automatic;
173+ TestTargetID = 319C19311B4843EB005EFEE5;
181174 };
182− 319C19461B4843EB005EFEE5 = {
175+ 319C19311B4843EB005EFEE5 = {
183176 CreatedOnToolsVersion = 6.4;
184177 DevelopmentTeam = 289M6XEDV4;
185− LastSwiftMigration = 0800;
186− TestTargetID = 319C19311B4843EB005EFEE5;
178+ LastSwiftMigration = 0900;
187179 };
188180 };
189181 };
@@ -201,58 +193,58 @@
201193 projectRoot = "";
202194 targets = (
203195 319C19311B4843EB005EFEE5 /* GMStepperExample */,
204− 319C19461B4843EB005EFEE5 /* GMStepperExampleTests */,
196+ 3116C0D71DA4DD360015AC69 /* GMStepperExampleTests */,
205197 );
206198 };
207199/* End PBXProject section */
208200
209201/* Begin PBXResourcesBuildPhase section */
210− 319C19301B4843EB005EFEE5 /* Resources */ = {
202+ 3116C0D61DA4DD360015AC69 /* Resources */ = {
211203 isa = PBXResourcesBuildPhase;
212204 buildActionMask = 2147483647;
213205 files = (
214− 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
215− 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
216− 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
217206 );
218207 runOnlyForDeploymentPostprocessing = 0;
219208 };
220− 319C19451B4843EB005EFEE5 /* Resources */ = {
209+ 319C19301B4843EB005EFEE5 /* Resources */ = {
221210 isa = PBXResourcesBuildPhase;
222211 buildActionMask = 2147483647;
223212 files = (
213+ 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
214+ 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
215+ 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
224216 );
225217 runOnlyForDeploymentPostprocessing = 0;
226218 };
227219/* End PBXResourcesBuildPhase section */
228220
229221/* Begin PBXSourcesBuildPhase section */
230− 319C192E1B4843EB005EFEE5 /* Sources */ = {
222+ 3116C0D41DA4DD360015AC69 /* Sources */ = {
231223 isa = PBXSourcesBuildPhase;
232224 buildActionMask = 2147483647;
233225 files = (
234− 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
235− 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
236− 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
226+ 3116C0DB1DA4DD360015AC69 /* GMStepperExampleTests.swift in Sources */,
227+ 3198AC771DA4DEE500311FB3 /* GMStepper.swift in Sources */,
237228 );
238229 runOnlyForDeploymentPostprocessing = 0;
239230 };
240− 319C19431B4843EB005EFEE5 /* Sources */ = {
231+ 319C192E1B4843EB005EFEE5 /* Sources */ = {
241232 isa = PBXSourcesBuildPhase;
242233 buildActionMask = 2147483647;
243234 files = (
244− 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */,
245− 3169DD3E1B496C33009791D1 /* GMStepper.swift in Sources */,
235+ 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
236+ 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
237+ 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
246238 );
247239 runOnlyForDeploymentPostprocessing = 0;
248240 };
249241/* End PBXSourcesBuildPhase section */
250242
251243/* Begin PBXTargetDependency section */
252− 319C19491B4843EB005EFEE5 /* PBXTargetDependency */ = {
244+ 3116C0DE1DA4DD360015AC69 /* PBXTargetDependency */ = {
253245 isa = PBXTargetDependency;
254246 target = 319C19311B4843EB005EFEE5 /* GMStepperExample */;
255− targetProxy = 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */;
247+ targetProxy = 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */;
256248 };
257249/* End PBXTargetDependency section */
258250
@@ -276,6 +268,44 @@
276268/* End PBXVariantGroup section */
277269
278270/* Begin XCBuildConfiguration section */
271+ 3116C0E01DA4DD360015AC69 /* Debug */ = {
272+ isa = XCBuildConfiguration;
273+ buildSettings = {
274+ BUNDLE_LOADER = "$(TEST_HOST)";
275+ CLANG_ANALYZER_NONNULL = YES;
276+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
277+ CLANG_WARN_SUSPICIOUS_MOVES = YES;
278+ DEBUG_INFORMATION_FORMAT = dwarf;
279+ INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
280+ IPHONEOS_DEPLOYMENT_TARGET = 10.0;
281+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
282+ PRODUCT_BUNDLE_IDENTIFIER = com.gmertk.GMStepperExampleTests;
283+ PRODUCT_NAME = "$(TARGET_NAME)";
284+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
285+ SWIFT_SWIFT3_OBJC_INFERENCE = On;
286+ SWIFT_VERSION = 4.0;
287+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
288+ };
289+ name = Debug;
290+ };
291+ 3116C0E11DA4DD360015AC69 /* Release */ = {
292+ isa = XCBuildConfiguration;
293+ buildSettings = {
294+ BUNDLE_LOADER = "$(TEST_HOST)";
295+ CLANG_ANALYZER_NONNULL = YES;
296+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
297+ CLANG_WARN_SUSPICIOUS_MOVES = YES;
298+ INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
299+ IPHONEOS_DEPLOYMENT_TARGET = 10.0;
300+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
301+ PRODUCT_BUNDLE_IDENTIFIER = com.gmertk.GMStepperExampleTests;
302+ PRODUCT_NAME = "$(TARGET_NAME)";
303+ SWIFT_SWIFT3_OBJC_INFERENCE = On;
304+ SWIFT_VERSION = 4.0;
305+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
306+ };
307+ name = Release;
308+ };
279309 319C194F1B4843EB005EFEE5 /* Debug */ = {
280310 isa = XCBuildConfiguration;
281311 buildSettings = {
@@ -284,14 +314,20 @@
284314 CLANG_CXX_LIBRARY = "libc++";
285315 CLANG_ENABLE_MODULES = YES;
286316 CLANG_ENABLE_OBJC_ARC = YES;
317+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
287318 CLANG_WARN_BOOL_CONVERSION = YES;
319+ CLANG_WARN_COMMA = YES;
288320 CLANG_WARN_CONSTANT_CONVERSION = YES;
289321 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
290322 CLANG_WARN_EMPTY_BODY = YES;
291323 CLANG_WARN_ENUM_CONVERSION = YES;
292324 CLANG_WARN_INFINITE_RECURSION = YES;
293325 CLANG_WARN_INT_CONVERSION = YES;
326+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
327+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
294328 CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
329+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
330+ CLANG_WARN_STRICT_PROTOTYPES = YES;
295331 CLANG_WARN_SUSPICIOUS_MOVE = YES;
296332 CLANG_WARN_UNREACHABLE_CODE = YES;
297333 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -331,14 +367,20 @@
331367 CLANG_CXX_LIBRARY = "libc++";
332368 CLANG_ENABLE_MODULES = YES;
333369 CLANG_ENABLE_OBJC_ARC = YES;
370+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
334371 CLANG_WARN_BOOL_CONVERSION = YES;
372+ CLANG_WARN_COMMA = YES;
335373 CLANG_WARN_CONSTANT_CONVERSION = YES;
336374 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
337375 CLANG_WARN_EMPTY_BODY = YES;
338376 CLANG_WARN_ENUM_CONVERSION = YES;
339377 CLANG_WARN_INFINITE_RECURSION = YES;
340378 CLANG_WARN_INT_CONVERSION = YES;
379+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
380+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
341381 CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
382+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
383+ CLANG_WARN_STRICT_PROTOTYPES = YES;
342384 CLANG_WARN_SUSPICIOUS_MOVE = YES;
343385 CLANG_WARN_UNREACHABLE_CODE = YES;
344386 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -372,7 +414,8 @@
372414 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
373415 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
374416 PRODUCT_NAME = "$(TARGET_NAME)";
375− SWIFT_VERSION = 3.0;
417+ SWIFT_SWIFT3_OBJC_INFERENCE = Default;
418+ SWIFT_VERSION = 4.0;
376419 };
377420 name = Debug;
378421 };
@@ -385,76 +428,37 @@
385428 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
386429 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
387430 PRODUCT_NAME = "$(TARGET_NAME)";
388− SWIFT_VERSION = 3.0;
389− };
390− name = Release;
391− };
392− 319C19551B4843EB005EFEE5 /* Debug */ = {
393− isa = XCBuildConfiguration;
394− buildSettings = {
395− BUNDLE_LOADER = "$(TEST_HOST)";
396− DEVELOPMENT_TEAM = 289M6XEDV4;
397− FRAMEWORK_SEARCH_PATHS = (
398− "$(SDKROOT)/Developer/Library/Frameworks",
399− "$(inherited)",
400− );
401− GCC_PREPROCESSOR_DEFINITIONS = (
402− "DEBUG=1",
403− "$(inherited)",
404− );
405− INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
406− LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
407− PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
408− PRODUCT_NAME = "$(TARGET_NAME)";
409− SWIFT_VERSION = 3.0;
410− TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
411− };
412− name = Debug;
413− };
414− 319C19561B4843EB005EFEE5 /* Release */ = {
415− isa = XCBuildConfiguration;
416− buildSettings = {
417− BUNDLE_LOADER = "$(TEST_HOST)";
418− DEVELOPMENT_TEAM = 289M6XEDV4;
419− FRAMEWORK_SEARCH_PATHS = (
420− "$(SDKROOT)/Developer/Library/Frameworks",
421− "$(inherited)",
422− );
423− INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
424− LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
425− PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
426− PRODUCT_NAME = "$(TARGET_NAME)";
427− SWIFT_VERSION = 3.0;
428− TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
431+ SWIFT_SWIFT3_OBJC_INFERENCE = Default;
432+ SWIFT_VERSION = 4.0;
429433 };
430434 name = Release;
431435 };
432436/* End XCBuildConfiguration section */
433437
434438/* Begin XCConfigurationList section */
435− 319C192D1B4843EB005EFEE5 /* Build configuration list for PBXProject "GMStepperExample" */ = {
439+ 3116C0DF1DA4DD360015AC69 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */ = {
436440 isa = XCConfigurationList;
437441 buildConfigurations = (
438− 319C194F1B4843EB005EFEE5 /* Debug */,
439− 319C19501B4843EB005EFEE5 /* Release */,
442+ 3116C0E01DA4DD360015AC69 /* Debug */,
443+ 3116C0E11DA4DD360015AC69 /* Release */,
440444 );
441445 defaultConfigurationIsVisible = 0;
442446 defaultConfigurationName = Release;
443447 };
444− 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */ = {
448+ 319C192D1B4843EB005EFEE5 /* Build configuration list for PBXProject "GMStepperExample" */ = {
445449 isa = XCConfigurationList;
446450 buildConfigurations = (
447− 319C19521B4843EB005EFEE5 /* Debug */,
448− 319C19531B4843EB005EFEE5 /* Release */,
451+ 319C194F1B4843EB005EFEE5 /* Debug */,
452+ 319C19501B4843EB005EFEE5 /* Release */,
449453 );
450454 defaultConfigurationIsVisible = 0;
451455 defaultConfigurationName = Release;
452456 };
453− 319C19541B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */ = {
457+ 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */ = {
454458 isa = XCConfigurationList;
455459 buildConfigurations = (
456− 319C19551B4843EB005EFEE5 /* Debug */,
457− 319C19561B4843EB005EFEE5 /* Release */,
460+ 319C19521B4843EB005EFEE5 /* Debug */,
461+ 319C19531B4843EB005EFEE5 /* Release */,
458462 );
459463 defaultConfigurationIsVisible = 0;
460464 defaultConfigurationName = Release;
GMStepperExample/GMStepperExample/AppDelegate.swift+10−10
@@ -14,33 +14,33 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
1414 var window: UIWindow?
1515
1616
17− func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
17+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
1818 // Override point for customization after application launch.
1919 return true
2020 }
2121
22− func applicationWillResignActive(application: UIApplication) {
22+ func applicationWillResignActive(_ application: UIApplication) {
2323 // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24− // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
24+ // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
2525 }
2626
27− func applicationDidEnterBackground(application: UIApplication) {
27+ func applicationDidEnterBackground(_ application: UIApplication) {
2828 // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
2929 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
3030 }
3131
32− func applicationWillEnterForeground(application: UIApplication) {
33− // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
32+ func applicationWillEnterForeground(_ application: UIApplication) {
33+ // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
3434 }
3535
36− func applicationDidBecomeActive(application: UIApplication) {
36+ func applicationDidBecomeActive(_ application: UIApplication) {
3737 // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
3838 }
3939
40− func applicationWillTerminate(application: UIApplication) {
40+ func applicationWillTerminate(_ application: UIApplication) {
4141 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
4242 }
43−
44−
43+
44+
4545}
4646
GMStepperExample/GMStepperExample/Base.lproj/Main.storyboard+30−34
@@ -1,9 +1,10 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2−<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10116" systemVersion="15E65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
2+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="vXZ-lx-hvc">
33 <dependencies>
44 <deployment identifier="iOS"/>
5− <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
5+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
66 <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
7+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
78 </dependencies>
89 <scenes>
910 <!--View Controller-->
@@ -15,12 +16,11 @@
1516 <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
1617 </layoutGuides>
1718 <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
18− <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
19+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
1920 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
2021 <subviews>
2122 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="AU6-4C-B2F" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
22− <rect key="frame" x="28" y="28" width="544" height="44"/>
23− <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
23+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
2424 <constraints>
2525 <constraint firstAttribute="height" constant="44" id="6mC-hP-wFD"/>
2626 </constraints>
@@ -34,27 +34,26 @@
3434 </userDefinedRuntimeAttributes>
3535 </view>
3636 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="if7-U5-bAM" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
37− <rect key="frame" x="140" y="116" width="320" height="66"/>
38− <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
37+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
3938 <constraints>
4039 <constraint firstAttribute="height" constant="66" id="iQi-6P-vt9"/>
4140 <constraint firstAttribute="width" constant="320" id="ji4-Pf-1fZ"/>
4241 </constraints>
4342 <userDefinedRuntimeAttributes>
4443 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
45− <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="calibratedRGB"/>
44+ <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
4645 </userDefinedRuntimeAttribute>
4746 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
48− <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="calibratedRGB"/>
47+ <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
4948 </userDefinedRuntimeAttribute>
5049 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
51− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
50+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
5251 </userDefinedRuntimeAttribute>
5352 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
54− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
53+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
5554 </userDefinedRuntimeAttribute>
5655 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
57− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
56+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
5857 </userDefinedRuntimeAttribute>
5958 <userDefinedRuntimeAttribute type="number" keyPath="stepValue">
6059 <real key="value" value="0.5"/>
@@ -62,49 +61,47 @@
6261 </userDefinedRuntimeAttributes>
6362 </view>
6463 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R9n-I0-fq7" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
65− <rect key="frame" x="200" y="226" width="200" height="66"/>
66− <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
64+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
6765 <constraints>
6866 <constraint firstAttribute="width" constant="200" id="dVu-w0-mf0"/>
6967 <constraint firstAttribute="height" constant="66" id="ie8-vl-NAV"/>
7068 </constraints>
7169 <userDefinedRuntimeAttributes>
7270 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
73− <color key="value" red="0.1819814891" green="0.69426733259999995" blue="0.53024792669999998" alpha="1" colorSpace="calibratedRGB"/>
71+ <color key="value" red="0.1819814891" green="0.69426733259999995" blue="0.53024792669999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
7472 </userDefinedRuntimeAttribute>
7573 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
76− <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
74+ <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
7775 </userDefinedRuntimeAttribute>
7876 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
79− <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="calibratedRGB"/>
77+ <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
8078 </userDefinedRuntimeAttribute>
8179 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
82− <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
80+ <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
8381 </userDefinedRuntimeAttribute>
8482 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
85− <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="calibratedRGB"/>
83+ <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
8684 </userDefinedRuntimeAttribute>
8785 </userDefinedRuntimeAttributes>
8886 </view>
8987 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="U8X-8Z-7Mo" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
90− <rect key="frame" x="28" y="336" width="544" height="44"/>
91− <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
88+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
9289 <constraints>
9390 <constraint firstAttribute="height" constant="44" id="aF3-T7-dIP"/>
9491 <constraint firstAttribute="width" constant="200" id="vhP-7K-vOu"/>
9592 </constraints>
9693 <userDefinedRuntimeAttributes>
9794 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
98− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
95+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
9996 </userDefinedRuntimeAttribute>
10097 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
101− <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
98+ <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
10299 </userDefinedRuntimeAttribute>
103100 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
104− <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
101+ <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
105102 </userDefinedRuntimeAttribute>
106103 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
107− <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
104+ <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
108105 </userDefinedRuntimeAttribute>
109106 <userDefinedRuntimeAttribute type="number" keyPath="labelWidthWeight">
110107 <real key="value" value="0.69999999999999996"/>
@@ -115,7 +112,7 @@
115112 <integer key="value" value="0"/>
116113 </userDefinedRuntimeAttribute>
117114 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
118− <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
115+ <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
119116 </userDefinedRuntimeAttribute>
120117 <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
121118 <integer key="value" value="100"/>
@@ -128,8 +125,7 @@
128125 </variation>
129126 </view>
130127 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9Ri-Yr-sRs" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
131− <rect key="frame" x="210" y="424" width="180" height="50"/>
132− <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
128+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
133129 <constraints>
134130 <constraint firstAttribute="width" constant="180" id="dhO-Nd-SFk"/>
135131 <constraint firstAttribute="height" constant="50" id="xPS-vU-cZc"/>
@@ -148,24 +144,24 @@
148144 <real key="value" value="4"/>
149145 </userDefinedRuntimeAttribute>
150146 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
151− <color key="value" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
147+ <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
152148 </userDefinedRuntimeAttribute>
153149 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
154− <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="calibratedRGB"/>
150+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
155151 </userDefinedRuntimeAttribute>
156152 <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
157− <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="calibratedRGB"/>
153+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
158154 </userDefinedRuntimeAttribute>
159155 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
160− <color key="value" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
156+ <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
161157 </userDefinedRuntimeAttribute>
162158 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
163− <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="calibratedRGB"/>
159+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
164160 </userDefinedRuntimeAttribute>
165161 </userDefinedRuntimeAttributes>
166162 </view>
167163 </subviews>
168− <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
164+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
169165 <constraints>
170166 <constraint firstItem="R9n-I0-fq7" firstAttribute="centerX" secondItem="U8X-8Z-7Mo" secondAttribute="centerX" id="3cD-WW-Qg4"/>
171167 <constraint firstItem="if7-U5-bAM" firstAttribute="top" secondItem="AU6-4C-B2F" secondAttribute="bottom" constant="44" id="662-W9-CUn"/>
GMStepperExample/GMStepperExample/ViewController.swift+1−1
@@ -16,7 +16,7 @@ class ViewController: UIViewController {
1616 stepper.addTarget(self, action: #selector(ViewController.stepperValueChanged), for: .valueChanged)
1717 }
1818
19− func stepperValueChanged(stepper: GMStepper) {
19+ @objc func stepperValueChanged(stepper: GMStepper) {
2020 print(stepper.value, terminator: "")
2121 }
2222}
GMStepperExample/GMStepperExampleTests/GMStepperExampleTests.swift+3−3
@@ -6,8 +6,8 @@
66// Copyright (c) 2015 Gunay Mert Karadogan. All rights reserved.
77//
88
9−import UIKit
109import XCTest
10+import UIKit
1111
1212class GMStepperExampleTests: XCTestCase {
1313 var stepper: GMStepper!
@@ -37,6 +37,6 @@ class GMStepperExampleTests: XCTestCase {
3737
3838 XCTAssert(stepper.value == stepper.maximumValue, "Pass")
3939 }
40−
41−
40+
41+
4242}
GMStepperExample/GMStepperExampleTests/Info.plist−2
@@ -16,8 +16,6 @@
1616 <string>BNDL</string>
1717 <key>CFBundleShortVersionString</key>
1818 <string>1.0</string>
19− <key>CFBundleSignature</key>
20− <string>????</string>
2119 <key>CFBundleVersion</key>
2220 <string>1</string>
2321</dict>
README.md+7−2
@@ -5,6 +5,7 @@
55
66A stepper with a sliding label in the middle. Pan the label or tap the buttons. Check out the tutorial, [How to Build a Custom Stepper - Part 1](http://gmertk.github.io/custom-stepper-part-1/).
77
8+
89## Screenshot
910
1011![Screenshot_1.gif](https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.gif)
@@ -68,6 +69,9 @@ var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alph
6869/// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
6970var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)
7071
72+/// Corner radius of the middle label's layer. Defaults to 0.0.
73+var labelCornerRadius: CGFloat = 0.0
74+
7175/// Corner radius of the stepper's layer. Defaults to 4.0.
7276var cornerRadius: CGFloat = 4.0
7377
@@ -85,9 +89,10 @@ var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, al
8589```
8690
8791
88−## Author
92+## Authors
8993
90−Günay Mert Karadoğan, mertkaradogan@gmail.com
94+* [Brent Whitman](https://github.com/bwhtmn) - Maintainer
95+* [Günay Mert Karadoğan](https://github.com/gmertk) - Creator
9196
9297## License
9398