on master help sign in
.gitignore+2
since splitsnapshots
unifiedsplit
@@ -31,3 +31,5 @@ DerivedData
31# Carthage/Checkouts
31# Carthage/Checkouts
32
32
33Carthage/Build
33Carthage/Build
34+
35+.DS_Store
.swift-versionnew file+1
@@ -0,0 +1 @@
1+4.0
GMStepper.podspec+2−2
@@ -1,9 +1,9 @@
1Pod::Spec.new do |s|
1Pod::Spec.new do |s|
2 s.name = "GMStepper"
2 s.name = "GMStepper"
3− s.version = "1.1.0"
3+ s.version = "2.1"
4 s.summary = "A stepper with a sliding label in the middle."
4 s.summary = "A stepper with a sliding label in the middle."
5 s.homepage = "https://github.com/gmertk/GMStepper"
5 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"
7 s.license = 'MIT'
7 s.license = 'MIT'
8 s.author = { "Gunay Mert Karadogan" => "mertkaradogan@gmail.com" }
8 s.author = { "Gunay Mert Karadogan" => "mertkaradogan@gmail.com" }
9 s.source = { :git => "https://github.com/gmertk/GMStepper.git", :tag => s.version.to_s }
9 s.source = { :git => "https://github.com/gmertk/GMStepper.git", :tag => s.version.to_s }
GMStepper/GMStepper.swift+133−74
@@ -11,72 +11,79 @@ import UIKit
11@IBDesignable public class GMStepper: UIControl {
11@IBDesignable public class GMStepper: UIControl {
12
12
13 /// Current value of the stepper. Defaults to 0.
13 /// Current value of the stepper. Defaults to 0.
14− @IBInspectable public var value: Double = 0 {
14+ @objc @IBInspectable public var value: Double = 0 {
15 didSet {
15 didSet {
16 value = min(maximumValue, max(minimumValue, value))
16 value = min(maximumValue, max(minimumValue, value))
17
17
18 let isInteger = floor(value) == value
18 let isInteger = floor(value) == value
19−
19+
20+ //
21+ // If we have items, we will display them as steps
22+ //
23+
24+ if isInteger && stepValue == 1.0 && items.count > 0 {
25+ label.text = items[Int(value)]
26+ }
20− if showIntegerIfDoubleIsInteger && isInteger {
27+ else if showIntegerIfDoubleIsInteger && isInteger {
21 label.text = String(stringInterpolationSegment: Int(value))
28 label.text = String(stringInterpolationSegment: Int(value))
22 } else {
29 } else {
23 label.text = String(stringInterpolationSegment: value)
30 label.text = String(stringInterpolationSegment: value)
24 }
31 }
25
32
26 if oldValue != value {
33 if oldValue != value {
27− sendActionsForControlEvents(.ValueChanged)
34+ sendActions(for: .valueChanged)
28 }
35 }
29 }
36 }
30 }
37 }
31
38
32 /// Minimum value. Must be less than maximumValue. Defaults to 0.
39 /// Minimum value. Must be less than maximumValue. Defaults to 0.
33− @IBInspectable public var minimumValue: Double = 0 {
40+ @objc @IBInspectable public var minimumValue: Double = 0 {
34 didSet {
41 didSet {
35 value = min(maximumValue, max(minimumValue, value))
42 value = min(maximumValue, max(minimumValue, value))
36 }
43 }
37 }
44 }
38
45
39 /// Maximum value. Must be more than minimumValue. Defaults to 100.
46 /// Maximum value. Must be more than minimumValue. Defaults to 100.
40− @IBInspectable public var maximumValue: Double = 100 {
47+ @objc @IBInspectable public var maximumValue: Double = 100 {
41 didSet {
48 didSet {
42 value = min(maximumValue, max(minimumValue, value))
49 value = min(maximumValue, max(minimumValue, value))
43 }
50 }
44 }
51 }
45
52
46 /// Step/Increment value as in UIStepper. Defaults to 1.
53 /// Step/Increment value as in UIStepper. Defaults to 1.
47− @IBInspectable public var stepValue: Double = 1
54+ @objc @IBInspectable public var stepValue: Double = 1
48
55
49 /// The same as UIStepper's autorepeat. If true, holding on the buttons or keeping the pan gesture alters the value repeatedly. Defaults to true.
56 /// The same as UIStepper's autorepeat. If true, holding on the buttons or keeping the pan gesture alters the value repeatedly. Defaults to true.
50− @IBInspectable public var autorepeat: Bool = true
57+ @objc @IBInspectable public var autorepeat: Bool = true
51
58
52 /// If the value is integer, it is shown without floating point.
59 /// If the value is integer, it is shown without floating point.
53− @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
60+ @objc @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
54
61
55 /// Text on the left button. Be sure that it fits in the button. Defaults to "−".
62 /// Text on the left button. Be sure that it fits in the button. Defaults to "−".
56− @IBInspectable public var leftButtonText: String = "−" {
63+ @objc @IBInspectable public var leftButtonText: String = "−" {
57 didSet {
64 didSet {
58− leftButton.setTitle(leftButtonText, forState: .Normal)
65+ leftButton.setTitle(leftButtonText, for: .normal)
59 }
66 }
60 }
67 }
61
68
62 /// Text on the right button. Be sure that it fits in the button. Defaults to "+".
69 /// Text on the right button. Be sure that it fits in the button. Defaults to "+".
63− @IBInspectable public var rightButtonText: String = "+" {
70+ @objc @IBInspectable public var rightButtonText: String = "+" {
64 didSet {
71 didSet {
65− rightButton.setTitle(rightButtonText, forState: .Normal)
72+ rightButton.setTitle(rightButtonText, for: .normal)
66 }
73 }
67 }
74 }
68
75
69 /// Text color of the buttons. Defaults to white.
76 /// Text color of the buttons. Defaults to white.
70− @IBInspectable public var buttonsTextColor: UIColor = UIColor.whiteColor() {
77+ @objc @IBInspectable public var buttonsTextColor: UIColor = UIColor.white {
71 didSet {
78 didSet {
72 for button in [leftButton, rightButton] {
79 for button in [leftButton, rightButton] {
73− button.setTitleColor(buttonsTextColor, forState: .Normal)
80+ button.setTitleColor(buttonsTextColor, for: .normal)
74 }
81 }
75 }
82 }
76 }
83 }
77
84
78 /// Background color of the buttons. Defaults to dark blue.
85 /// Background color of the buttons. Defaults to dark blue.
79− @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) {
80 didSet {
87 didSet {
81 for button in [leftButton, rightButton] {
88 for button in [leftButton, rightButton] {
82 button.backgroundColor = buttonsBackgroundColor
89 button.backgroundColor = buttonsBackgroundColor
@@ -86,7 +93,7 @@ import UIKit
86 }
93 }
87
94
88 /// Font of the buttons. Defaults to AvenirNext-Bold, 20.0 points in size.
95 /// Font of the buttons. Defaults to AvenirNext-Bold, 20.0 points in size.
89− public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
96+ @objc public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
90 didSet {
97 didSet {
91 for button in [leftButton, rightButton] {
98 for button in [leftButton, rightButton] {
92 button.titleLabel?.font = buttonsFont
99 button.titleLabel?.font = buttonsFont
@@ -95,36 +102,59 @@ import UIKit
95 }
102 }
96
103
97 /// Text color of the middle label. Defaults to white.
104 /// Text color of the middle label. Defaults to white.
98− @IBInspectable public var labelTextColor: UIColor = UIColor.whiteColor() {
105+ @objc @IBInspectable public var labelTextColor: UIColor = UIColor.white {
99 didSet {
106 didSet {
100 label.textColor = labelTextColor
107 label.textColor = labelTextColor
101 }
108 }
102 }
109 }
103
110
104 /// Text color of the middle label. Defaults to lighter blue.
111 /// Text color of the middle label. Defaults to lighter blue.
105− @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) {
106 didSet {
113 didSet {
107 label.backgroundColor = labelBackgroundColor
114 label.backgroundColor = labelBackgroundColor
108 }
115 }
109 }
116 }
110
117
111 /// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
118 /// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
112− public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
119+ @objc public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
113 didSet {
120 didSet {
114 label.font = labelFont
121 label.font = labelFont
115 }
122 }
116 }
123 }
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+ }
117
131
118 /// Corner radius of the stepper's layer. Defaults to 4.0.
132 /// Corner radius of the stepper's layer. Defaults to 4.0.
119− @IBInspectable public var cornerRadius: CGFloat = 4.0 {
133+ @objc @IBInspectable public var cornerRadius: CGFloat = 4.0 {
120 didSet {
134 didSet {
121 layer.cornerRadius = cornerRadius
135 layer.cornerRadius = cornerRadius
122 clipsToBounds = true
136 clipsToBounds = true
123 }
137 }
124 }
138 }
139+
140+ /// Border width of the stepper and middle label's layer. Defaults to 0.0.
141+ @objc @IBInspectable public var borderWidth: CGFloat = 0.0 {
142+ didSet {
143+ layer.borderWidth = borderWidth
144+ label.layer.borderWidth = borderWidth
145+ }
146+ }
147+
148+ /// Color of the border of the stepper and middle label's layer. Defaults to clear color.
149+ @objc @IBInspectable public var borderColor: UIColor = UIColor.clear {
150+ didSet {
151+ layer.borderColor = borderColor.cgColor
152+ label.layer.borderColor = borderColor.cgColor
153+ }
154+ }
125
155
126 /// 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.
156 /// 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.
127− @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
157+ @objc @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
128 didSet {
158 didSet {
129 labelWidthWeight = min(1, max(0, labelWidthWeight))
159 labelWidthWeight = min(1, max(0, labelWidthWeight))
130 setNeedsLayout()
160 setNeedsLayout()
@@ -132,7 +162,7 @@ import UIKit
132 }
162 }
133
163
134 /// Color of the flashing animation on the buttons in case the value hit the limit.
164 /// Color of the flashing animation on the buttons in case the value hit the limit.
135− @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)
136
166
137 /**
167 /**
138 Width of the sliding animation. When buttons clicked, the middle label does a slide animation towards to the clicked button. Defaults to 5.
168 Width of the sliding animation. When buttons clicked, the middle label does a slide animation towards to the clicked button. Defaults to 5.
@@ -140,38 +170,40 @@ import UIKit
140 let labelSlideLength: CGFloat = 5
170 let labelSlideLength: CGFloat = 5
141
171
142 /// Duration of the sliding animation
172 /// Duration of the sliding animation
143− let labelSlideDuration = NSTimeInterval(0.1)
173+ let labelSlideDuration = TimeInterval(0.1)
144
174
145 /// Duration of the animation when the value hits the limit.
175 /// Duration of the animation when the value hits the limit.
146− let limitHitAnimationDuration = NSTimeInterval(0.1)
176+ let limitHitAnimationDuration = TimeInterval(0.1)
147
177
148 lazy var leftButton: UIButton = {
178 lazy var leftButton: UIButton = {
149 let button = UIButton()
179 let button = UIButton()
150− button.setTitle(self.leftButtonText, forState: .Normal)
180+ button.setTitle(self.leftButtonText, for: .normal)
151− button.setTitleColor(self.buttonsTextColor, forState: .Normal)
181+ button.setTitleColor(self.buttonsTextColor, for: .normal)
152 button.backgroundColor = self.buttonsBackgroundColor
182 button.backgroundColor = self.buttonsBackgroundColor
153 button.titleLabel?.font = self.buttonsFont
183 button.titleLabel?.font = self.buttonsFont
154− button.addTarget(self, action: "leftButtonTouchDown:", forControlEvents: .TouchDown)
184+ button.addTarget(self, action: #selector(GMStepper.leftButtonTouchDown), for: .touchDown)
185+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
155− button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpInside)
186+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
156− button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpOutside)
187+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
157 return button
188 return button
158 }()
189 }()
159
190
160 lazy var rightButton: UIButton = {
191 lazy var rightButton: UIButton = {
161 let button = UIButton()
192 let button = UIButton()
162− button.setTitle(self.rightButtonText, forState: .Normal)
193+ button.setTitle(self.rightButtonText, for: .normal)
163− button.setTitleColor(self.buttonsTextColor, forState: .Normal)
194+ button.setTitleColor(self.buttonsTextColor, for: .normal)
164 button.backgroundColor = self.buttonsBackgroundColor
195 button.backgroundColor = self.buttonsBackgroundColor
165 button.titleLabel?.font = self.buttonsFont
196 button.titleLabel?.font = self.buttonsFont
166− button.addTarget(self, action: "rightButtonTouchDown:", forControlEvents: .TouchDown)
197+ button.addTarget(self, action: #selector(GMStepper.rightButtonTouchDown), for: .touchDown)
198+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
167− button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpInside)
199+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
168− button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpOutside)
200+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
169 return button
201 return button
170 }()
202 }()
171
203
172 lazy var label: UILabel = {
204 lazy var label: UILabel = {
173 let label = UILabel()
205 let label = UILabel()
174− label.textAlignment = .Center
206+ label.textAlignment = .center
175 if self.showIntegerIfDoubleIsInteger && floor(self.value) == self.value {
207 if self.showIntegerIfDoubleIsInteger && floor(self.value) == self.value {
176 label.text = String(stringInterpolationSegment: Int(self.value))
208 label.text = String(stringInterpolationSegment: Int(self.value))
177 } else {
209 } else {
@@ -180,8 +212,10 @@ import UIKit
180 label.textColor = self.labelTextColor
212 label.textColor = self.labelTextColor
181 label.backgroundColor = self.labelBackgroundColor
213 label.backgroundColor = self.labelBackgroundColor
182 label.font = self.labelFont
214 label.font = self.labelFont
183− label.userInteractionEnabled = true
215+ label.layer.cornerRadius = self.labelCornerRadius
216+ label.layer.masksToBounds = true
217+ label.isUserInteractionEnabled = true
184− let panRecognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
218+ let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(GMStepper.handlePan))
185 panRecognizer.maximumNumberOfTouches = 1
219 panRecognizer.maximumNumberOfTouches = 1
186 label.addGestureRecognizer(panRecognizer)
220 label.addGestureRecognizer(panRecognizer)
187 return label
221 return label
@@ -209,9 +243,33 @@ import UIKit
209 }
243 }
210 }
244 }
211 }
245 }
246+
247+
248+ @objc public var items : [String] = [] {
249+ didSet {
250+ let isInteger = floor(value) == value
251+
252+ //
253+ // If we have items, we will display them as steps
254+ //
255+
256+ if isInteger && stepValue == 1.0 && items.count > 0 {
257+
258+ var value = Int(self.value)
259+
260+ if value >= items.count {
261+ value = items.count - 1
262+ self.value = Double(value)
263+ }
264+ else {
265+ label.text = items[value]
266+ }
267+ }
268+ }
269+ }
212
270
213 /// Timer used for autorepeat option
271 /// Timer used for autorepeat option
214− var timer: NSTimer?
272+ var timer: Timer?
215
273
216 /** When UIStepper reaches its top speed, it alters the value with a time interval of ~0.05 sec.
274 /** When UIStepper reaches its top speed, it alters the value with a time interval of ~0.05 sec.
217 The user pressing and holding on the stepper repeatedly:
275 The user pressing and holding on the stepper repeatedly:
@@ -219,7 +277,7 @@ import UIKit
219 - For the next 1.5 sec, it changes the value every 0.1 sec.
277 - For the next 1.5 sec, it changes the value every 0.1 sec.
220 - Then, every 0.05 sec.
278 - Then, every 0.05 sec.
221 */
279 */
222− let timerInterval = NSTimeInterval(0.05)
280+ let timerInterval = TimeInterval(0.05)
223
281
224 /// Check the handleTimerFire: function. While it is counting the number of fires, it decreases the mod value so that the value is altered more frequently.
282 /// Check the handleTimerFire: function. While it is counting the number of fires, it decreases the mod value so that the value is altered more frequently.
225 var timerFireCount = 0
283 var timerFireCount = 0
@@ -233,12 +291,12 @@ import UIKit
233 }
291 }
234 }
292 }
235
293
236− required public init?(coder aDecoder: NSCoder) {
294+ @objc required public init?(coder aDecoder: NSCoder) {
237 super.init(coder: aDecoder)
295 super.init(coder: aDecoder)
238 setup()
296 setup()
239 }
297 }
240
298
241− public override init(frame: CGRect) {
299+ @objc public override init(frame: CGRect) {
242 super.init(frame: frame)
300 super.init(frame: frame)
243 setup()
301 setup()
244 }
302 }
@@ -251,8 +309,9 @@ import UIKit
251 backgroundColor = buttonsBackgroundColor
309 backgroundColor = buttonsBackgroundColor
252 layer.cornerRadius = cornerRadius
310 layer.cornerRadius = cornerRadius
253 clipsToBounds = true
311 clipsToBounds = true
312+ labelOriginalCenter = label.center
254
313
255− NSNotificationCenter.defaultCenter().addObserver(self, selector: "reset", name: UIApplicationWillResignActiveNotification, object: nil)
314+ NotificationCenter.default.addObserver(self, selector: #selector(GMStepper.reset), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
256 }
315 }
257
316
258 public override func layoutSubviews() {
317 public override func layoutSubviews() {
@@ -278,7 +337,7 @@ import UIKit
278
337
279 deinit {
338 deinit {
280 resetTimer()
339 resetTimer()
281− NSNotificationCenter.defaultCenter().removeObserver(self)
340+ NotificationCenter.default.removeObserver(self)
282 }
341 }
283
342
284 /// Useful closure for logging the timer interval. You can call this in the timer handler to test the autorepeat option. Not used in the current implementation.
343 /// Useful closure for logging the timer interval. You can call this in the timer handler to test the autorepeat option. Not used in the current implementation.
@@ -297,17 +356,17 @@ import UIKit
297
356
298// MARK: Pan Gesture
357// MARK: Pan Gesture
299extension GMStepper {
358extension GMStepper {
300− func handlePan(gesture: UIPanGestureRecognizer) {
359+ @objc func handlePan(gesture: UIPanGestureRecognizer) {
301 switch gesture.state {
360 switch gesture.state {
302− case .Began:
361+ case .began:
303− leftButton.enabled = false
362+ leftButton.isEnabled = false
304− rightButton.enabled = false
363+ rightButton.isEnabled = false
305− case .Changed:
364+ case .changed:
306− let translation = gesture.translationInView(label)
365+ let translation = gesture.translation(in: label)
307− gesture.setTranslation(CGPointZero, inView: label)
366+ gesture.setTranslation(CGPoint.zero, in: label)
308
367
309− let slidingRight = gesture.velocityInView(label).x > 0
368+ let slidingRight = gesture.velocity(in: label).x > 0
310− let slidingLeft = gesture.velocityInView(label).x < 0
369+ let slidingLeft = gesture.velocity(in: label).x < 0
311
370
312 // Move the label with pan
371 // Move the label with pan
313 if slidingRight {
372 if slidingRight {
@@ -340,23 +399,23 @@ extension GMStepper {
340 self.rightButton.backgroundColor = self.buttonsBackgroundColor
399 self.rightButton.backgroundColor = self.buttonsBackgroundColor
341 self.leftButton.backgroundColor = self.buttonsBackgroundColor
400 self.leftButton.backgroundColor = self.buttonsBackgroundColor
342 }
401 }
343− case .Ended, .Cancelled, .Failed:
402+ case .ended, .cancelled, .failed:
344 reset()
403 reset()
345 default:
404 default:
346 break
405 break
347 }
406 }
348 }
407 }
349
408
350− func reset() {
409+ @objc func reset() {
351 panState = .Stable
410 panState = .Stable
352 stepperState = .Stable
411 stepperState = .Stable
353 resetTimer()
412 resetTimer()
354
413
355− leftButton.enabled = true
414+ leftButton.isEnabled = true
356− rightButton.enabled = true
415+ rightButton.isEnabled = true
357− label.userInteractionEnabled = true
416+ label.isUserInteractionEnabled = true
358
417
359− UIView.animateWithDuration(self.labelSlideDuration, animations: {
418+ UIView.animate(withDuration: self.labelSlideDuration, animations: {
360 self.label.center = self.labelOriginalCenter
419 self.label.center = self.labelOriginalCenter
361 self.rightButton.backgroundColor = self.buttonsBackgroundColor
420 self.rightButton.backgroundColor = self.buttonsBackgroundColor
362 self.leftButton.backgroundColor = self.buttonsBackgroundColor
421 self.leftButton.backgroundColor = self.buttonsBackgroundColor
@@ -366,9 +425,9 @@ extension GMStepper {
366
425
367// MARK: Button Events
426// MARK: Button Events
368extension GMStepper {
427extension GMStepper {
369− func leftButtonTouchDown(button: UIButton) {
428+ @objc func leftButtonTouchDown(button: UIButton) {
370− rightButton.enabled = false
429+ rightButton.isEnabled = false
371− label.userInteractionEnabled = false
430+ label.isUserInteractionEnabled = false
372 resetTimer()
431 resetTimer()
373
432
374 if value == minimumValue {
433 if value == minimumValue {
@@ -380,9 +439,9 @@ extension GMStepper {
380
439
381 }
440 }
382
441
383− func rightButtonTouchDown(button: UIButton) {
442+ @objc func rightButtonTouchDown(button: UIButton) {
384− leftButton.enabled = false
443+ leftButton.isEnabled = false
385− label.userInteractionEnabled = false
444+ label.isUserInteractionEnabled = false
386 resetTimer()
445 resetTimer()
387
446
388 if value == maximumValue {
447 if value == maximumValue {
@@ -393,7 +452,7 @@ extension GMStepper {
393 }
452 }
394 }
453 }
395
454
396− func buttonTouchUp(button: UIButton) {
455+ @objc func buttonTouchUp(button: UIButton) {
397 reset()
456 reset()
398 }
457 }
399}
458}
@@ -402,20 +461,20 @@ extension GMStepper {
402extension GMStepper {
461extension GMStepper {
403
462
404 func animateSlideLeft() {
463 func animateSlideLeft() {
405− UIView.animateWithDuration(labelSlideDuration) {
464+ UIView.animate(withDuration: labelSlideDuration) {
406 self.label.center.x -= self.labelSlideLength
465 self.label.center.x -= self.labelSlideLength
407 }
466 }
408 }
467 }
409
468
410 func animateSlideRight() {
469 func animateSlideRight() {
411− UIView.animateWithDuration(labelSlideDuration) {
470+ UIView.animate(withDuration: labelSlideDuration) {
412 self.label.center.x += self.labelSlideLength
471 self.label.center.x += self.labelSlideLength
413 }
472 }
414 }
473 }
415
474
416 func animateToOriginalPosition() {
475 func animateToOriginalPosition() {
417 if self.label.center != self.labelOriginalCenter {
476 if self.label.center != self.labelOriginalCenter {
418− UIView.animateWithDuration(labelSlideDuration) {
477+ UIView.animate(withDuration: labelSlideDuration) {
419 self.label.center = self.labelOriginalCenter
478 self.label.center = self.labelOriginalCenter
420 }
479 }
421 }
480 }
@@ -423,14 +482,14 @@ extension GMStepper {
423
482
424 func animateLimitHitIfNeeded() {
483 func animateLimitHitIfNeeded() {
425 if value == minimumValue {
484 if value == minimumValue {
426− animateLimitHitForButton(leftButton)
485+ animateLimitHitForButton(button: leftButton)
427 } else if value == maximumValue {
486 } else if value == maximumValue {
428− animateLimitHitForButton(rightButton)
487+ animateLimitHitForButton(button: rightButton)
429 }
488 }
430 }
489 }
431
490
432 func animateLimitHitForButton(button: UIButton){
491 func animateLimitHitForButton(button: UIButton){
433− UIView.animateWithDuration(limitHitAnimationDuration) {
492+ UIView.animate(withDuration: limitHitAnimationDuration) {
434 button.backgroundColor = self.limitHitAnimationColor
493 button.backgroundColor = self.limitHitAnimationColor
435 }
494 }
436 }
495 }
@@ -438,7 +497,7 @@ extension GMStepper {
438
497
439// MARK: Timer
498// MARK: Timer
440extension GMStepper {
499extension GMStepper {
441− func handleTimerFire(timer: NSTimer) {
500+ @objc func handleTimerFire(timer: Timer) {
442 timerFireCount += 1
501 timerFireCount += 1
443
502
444 if timerFireCount % timerFireCountModulo == 0 {
503 if timerFireCount % timerFireCountModulo == 0 {
@@ -447,7 +506,7 @@ extension GMStepper {
447 }
506 }
448
507
449 func scheduleTimer() {
508 func scheduleTimer() {
450− timer = NSTimer.scheduledTimerWithTimeInterval(timerInterval, target: self, selector: "handleTimerFire:", userInfo: nil, repeats: true)
509+ timer = Timer.scheduledTimer(timeInterval: timerInterval, target: self, selector: #selector(GMStepper.handleTimerFire), userInfo: nil, repeats: true)
451 }
510 }
452
511
453 func resetTimer() {
512 func resetTimer() {
GMStepperExample/GMStepperExample.xcodeproj/project.pbxproj+132−111
@@ -7,18 +7,18 @@
7 objects = {
7 objects = {
8
8
9/* Begin PBXBuildFile section */
9/* Begin PBXBuildFile section */
10+ 3116C0DB1DA4DD360015AC69 /* GMStepperExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3116C0DA1DA4DD360015AC69 /* GMStepperExampleTests.swift */; };
10− 3169DD3E1B496C33009791D1 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
11+ 3198AC771DA4DEE500311FB3 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
11 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19371B4843EB005EFEE5 /* AppDelegate.swift */; };
12 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19371B4843EB005EFEE5 /* AppDelegate.swift */; };
12 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19391B4843EB005EFEE5 /* ViewController.swift */; };
13 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19391B4843EB005EFEE5 /* ViewController.swift */; };
13 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 319C193B1B4843EB005EFEE5 /* Main.storyboard */; };
14 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 319C193B1B4843EB005EFEE5 /* Main.storyboard */; };
14 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 319C193E1B4843EB005EFEE5 /* Images.xcassets */; };
15 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 319C193E1B4843EB005EFEE5 /* Images.xcassets */; };
15 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 319C19401B4843EB005EFEE5 /* LaunchScreen.xib */; };
16 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 319C19401B4843EB005EFEE5 /* LaunchScreen.xib */; };
16− 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */; };
17 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
17 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
18/* End PBXBuildFile section */
18/* End PBXBuildFile section */
19
19
20/* Begin PBXContainerItemProxy section */
20/* Begin PBXContainerItemProxy section */
21− 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */ = {
21+ 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */ = {
22 isa = PBXContainerItemProxy;
22 isa = PBXContainerItemProxy;
23 containerPortal = 319C192A1B4843EB005EFEE5 /* Project object */;
23 containerPortal = 319C192A1B4843EB005EFEE5 /* Project object */;
24 proxyType = 1;
24 proxyType = 1;
@@ -28,6 +28,9 @@
28/* End PBXContainerItemProxy section */
28/* End PBXContainerItemProxy section */
29
29
30/* Begin PBXFileReference section */
30/* 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>"; };
31 319C19321B4843EB005EFEE5 /* GMStepperExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GMStepperExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
34 319C19321B4843EB005EFEE5 /* GMStepperExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GMStepperExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
32 319C19361B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
35 319C19361B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
33 319C19371B4843EB005EFEE5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
36 319C19371B4843EB005EFEE5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -35,21 +38,18 @@
35 319C193C1B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
38 319C193C1B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
36 319C193E1B4843EB005EFEE5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
39 319C193E1B4843EB005EFEE5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
37 319C19411B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
40 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>"; };
41 319C195B1B48445E005EFEE5 /* GMStepper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GMStepper.swift; sourceTree = "<group>"; };
41 319C195B1B48445E005EFEE5 /* GMStepper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GMStepper.swift; sourceTree = "<group>"; };
42/* End PBXFileReference section */
42/* End PBXFileReference section */
43
43
44/* Begin PBXFrameworksBuildPhase section */
44/* Begin PBXFrameworksBuildPhase section */
45− 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
45+ 3116C0D51DA4DD360015AC69 /* Frameworks */ = {
46 isa = PBXFrameworksBuildPhase;
46 isa = PBXFrameworksBuildPhase;
47 buildActionMask = 2147483647;
47 buildActionMask = 2147483647;
48 files = (
48 files = (
49 );
49 );
50 runOnlyForDeploymentPostprocessing = 0;
50 runOnlyForDeploymentPostprocessing = 0;
51 };
51 };
52− 319C19441B4843EB005EFEE5 /* Frameworks */ = {
52+ 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
53 isa = PBXFrameworksBuildPhase;
53 isa = PBXFrameworksBuildPhase;
54 buildActionMask = 2147483647;
54 buildActionMask = 2147483647;
55 files = (
55 files = (
@@ -59,12 +59,21 @@
59/* End PBXFrameworksBuildPhase section */
59/* End PBXFrameworksBuildPhase section */
60
60
61/* Begin PBXGroup section */
61/* 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+ };
62 319C19291B4843EB005EFEE5 = {
71 319C19291B4843EB005EFEE5 = {
63 isa = PBXGroup;
72 isa = PBXGroup;
64 children = (
73 children = (
65 319C195A1B48445E005EFEE5 /* GMStepper */,
74 319C195A1B48445E005EFEE5 /* GMStepper */,
66 319C19341B4843EB005EFEE5 /* GMStepperExample */,
75 319C19341B4843EB005EFEE5 /* GMStepperExample */,
67− 319C194A1B4843EB005EFEE5 /* GMStepperExampleTests */,
76+ 3116C0D91DA4DD360015AC69 /* GMStepperExampleTests */,
68 319C19331B4843EB005EFEE5 /* Products */,
77 319C19331B4843EB005EFEE5 /* Products */,
69 );
78 );
70 sourceTree = "<group>";
79 sourceTree = "<group>";
@@ -73,7 +82,7 @@
73 isa = PBXGroup;
82 isa = PBXGroup;
74 children = (
83 children = (
75 319C19321B4843EB005EFEE5 /* GMStepperExample.app */,
84 319C19321B4843EB005EFEE5 /* GMStepperExample.app */,
76− 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */,
85+ 3116C0D81DA4DD360015AC69 /* GMStepperExampleTests.xctest */,
77 );
86 );
78 name = Products;
87 name = Products;
79 sourceTree = "<group>";
88 sourceTree = "<group>";
@@ -99,23 +108,6 @@
99 name = "Supporting Files";
108 name = "Supporting Files";
100 sourceTree = "<group>";
109 sourceTree = "<group>";
101 };
110 };
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− };
119 319C195A1B48445E005EFEE5 /* GMStepper */ = {
111 319C195A1B48445E005EFEE5 /* GMStepper */ = {
120 isa = PBXGroup;
112 isa = PBXGroup;
121 children = (
113 children = (
@@ -128,6 +120,24 @@
128/* End PBXGroup section */
120/* End PBXGroup section */
129
121
130/* Begin PBXNativeTarget section */
122/* 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+ };
131 319C19311B4843EB005EFEE5 /* GMStepperExample */ = {
141 319C19311B4843EB005EFEE5 /* GMStepperExample */ = {
132 isa = PBXNativeTarget;
142 isa = PBXNativeTarget;
133 buildConfigurationList = 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */;
143 buildConfigurationList = 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */;
@@ -145,24 +155,6 @@
145 productReference = 319C19321B4843EB005EFEE5 /* GMStepperExample.app */;
155 productReference = 319C19321B4843EB005EFEE5 /* GMStepperExample.app */;
146 productType = "com.apple.product-type.application";
156 productType = "com.apple.product-type.application";
147 };
157 };
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− };
166/* End PBXNativeTarget section */
158/* End PBXNativeTarget section */
167
159
168/* Begin PBXProject section */
160/* Begin PBXProject section */
@@ -170,16 +162,20 @@
170 isa = PBXProject;
162 isa = PBXProject;
171 attributes = {
163 attributes = {
172 LastSwiftMigration = 0700;
164 LastSwiftMigration = 0700;
173− LastSwiftUpdateCheck = 0700;
165+ LastSwiftUpdateCheck = 0800;
174− LastUpgradeCheck = 0700;
166+ LastUpgradeCheck = 0900;
175 ORGANIZATIONNAME = "Gunay Mert Karadogan";
167 ORGANIZATIONNAME = "Gunay Mert Karadogan";
176 TargetAttributes = {
168 TargetAttributes = {
177− 319C19311B4843EB005EFEE5 = {
169+ 3116C0D71DA4DD360015AC69 = {
178− CreatedOnToolsVersion = 6.4;
170+ CreatedOnToolsVersion = 8.0;
171+ LastSwiftMigration = 0900;
172+ ProvisioningStyle = Automatic;
173+ TestTargetID = 319C19311B4843EB005EFEE5;
179 };
174 };
180− 319C19461B4843EB005EFEE5 = {
175+ 319C19311B4843EB005EFEE5 = {
181 CreatedOnToolsVersion = 6.4;
176 CreatedOnToolsVersion = 6.4;
182− TestTargetID = 319C19311B4843EB005EFEE5;
177+ DevelopmentTeam = 289M6XEDV4;
178+ LastSwiftMigration = 0900;
183 };
179 };
184 };
180 };
185 };
181 };
@@ -197,58 +193,58 @@
197 projectRoot = "";
193 projectRoot = "";
198 targets = (
194 targets = (
199 319C19311B4843EB005EFEE5 /* GMStepperExample */,
195 319C19311B4843EB005EFEE5 /* GMStepperExample */,
200− 319C19461B4843EB005EFEE5 /* GMStepperExampleTests */,
196+ 3116C0D71DA4DD360015AC69 /* GMStepperExampleTests */,
201 );
197 );
202 };
198 };
203/* End PBXProject section */
199/* End PBXProject section */
204
200
205/* Begin PBXResourcesBuildPhase section */
201/* Begin PBXResourcesBuildPhase section */
206− 319C19301B4843EB005EFEE5 /* Resources */ = {
202+ 3116C0D61DA4DD360015AC69 /* Resources */ = {
207 isa = PBXResourcesBuildPhase;
203 isa = PBXResourcesBuildPhase;
208 buildActionMask = 2147483647;
204 buildActionMask = 2147483647;
209 files = (
205 files = (
210− 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
211− 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
212− 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
213 );
206 );
214 runOnlyForDeploymentPostprocessing = 0;
207 runOnlyForDeploymentPostprocessing = 0;
215 };
208 };
216− 319C19451B4843EB005EFEE5 /* Resources */ = {
209+ 319C19301B4843EB005EFEE5 /* Resources */ = {
217 isa = PBXResourcesBuildPhase;
210 isa = PBXResourcesBuildPhase;
218 buildActionMask = 2147483647;
211 buildActionMask = 2147483647;
219 files = (
212 files = (
213+ 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
214+ 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
215+ 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
220 );
216 );
221 runOnlyForDeploymentPostprocessing = 0;
217 runOnlyForDeploymentPostprocessing = 0;
222 };
218 };
223/* End PBXResourcesBuildPhase section */
219/* End PBXResourcesBuildPhase section */
224
220
225/* Begin PBXSourcesBuildPhase section */
221/* Begin PBXSourcesBuildPhase section */
226− 319C192E1B4843EB005EFEE5 /* Sources */ = {
222+ 3116C0D41DA4DD360015AC69 /* Sources */ = {
227 isa = PBXSourcesBuildPhase;
223 isa = PBXSourcesBuildPhase;
228 buildActionMask = 2147483647;
224 buildActionMask = 2147483647;
229 files = (
225 files = (
230− 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
226+ 3116C0DB1DA4DD360015AC69 /* GMStepperExampleTests.swift in Sources */,
231− 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
227+ 3198AC771DA4DEE500311FB3 /* GMStepper.swift in Sources */,
232− 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
233 );
228 );
234 runOnlyForDeploymentPostprocessing = 0;
229 runOnlyForDeploymentPostprocessing = 0;
235 };
230 };
236− 319C19431B4843EB005EFEE5 /* Sources */ = {
231+ 319C192E1B4843EB005EFEE5 /* Sources */ = {
237 isa = PBXSourcesBuildPhase;
232 isa = PBXSourcesBuildPhase;
238 buildActionMask = 2147483647;
233 buildActionMask = 2147483647;
239 files = (
234 files = (
240− 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */,
235+ 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
241− 3169DD3E1B496C33009791D1 /* GMStepper.swift in Sources */,
236+ 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
237+ 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
242 );
238 );
243 runOnlyForDeploymentPostprocessing = 0;
239 runOnlyForDeploymentPostprocessing = 0;
244 };
240 };
245/* End PBXSourcesBuildPhase section */
241/* End PBXSourcesBuildPhase section */
246
242
247/* Begin PBXTargetDependency section */
243/* Begin PBXTargetDependency section */
248− 319C19491B4843EB005EFEE5 /* PBXTargetDependency */ = {
244+ 3116C0DE1DA4DD360015AC69 /* PBXTargetDependency */ = {
249 isa = PBXTargetDependency;
245 isa = PBXTargetDependency;
250 target = 319C19311B4843EB005EFEE5 /* GMStepperExample */;
246 target = 319C19311B4843EB005EFEE5 /* GMStepperExample */;
251− targetProxy = 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */;
247+ targetProxy = 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */;
252 };
248 };
253/* End PBXTargetDependency section */
249/* End PBXTargetDependency section */
254
250
@@ -272,6 +268,44 @@
272/* End PBXVariantGroup section */
268/* End PBXVariantGroup section */
273
269
274/* Begin XCBuildConfiguration section */
270/* 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+ };
275 319C194F1B4843EB005EFEE5 /* Debug */ = {
309 319C194F1B4843EB005EFEE5 /* Debug */ = {
276 isa = XCBuildConfiguration;
310 isa = XCBuildConfiguration;
277 buildSettings = {
311 buildSettings = {
@@ -280,13 +314,21 @@
280 CLANG_CXX_LIBRARY = "libc++";
314 CLANG_CXX_LIBRARY = "libc++";
281 CLANG_ENABLE_MODULES = YES;
315 CLANG_ENABLE_MODULES = YES;
282 CLANG_ENABLE_OBJC_ARC = YES;
316 CLANG_ENABLE_OBJC_ARC = YES;
317+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
283 CLANG_WARN_BOOL_CONVERSION = YES;
318 CLANG_WARN_BOOL_CONVERSION = YES;
319+ CLANG_WARN_COMMA = YES;
284 CLANG_WARN_CONSTANT_CONVERSION = YES;
320 CLANG_WARN_CONSTANT_CONVERSION = YES;
285 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
321 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
286 CLANG_WARN_EMPTY_BODY = YES;
322 CLANG_WARN_EMPTY_BODY = YES;
287 CLANG_WARN_ENUM_CONVERSION = YES;
323 CLANG_WARN_ENUM_CONVERSION = YES;
324+ CLANG_WARN_INFINITE_RECURSION = YES;
288 CLANG_WARN_INT_CONVERSION = YES;
325 CLANG_WARN_INT_CONVERSION = YES;
326+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
327+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
289 CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
328 CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
329+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
330+ CLANG_WARN_STRICT_PROTOTYPES = YES;
331+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
290 CLANG_WARN_UNREACHABLE_CODE = YES;
332 CLANG_WARN_UNREACHABLE_CODE = YES;
291 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
333 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
292 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
334 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -325,13 +367,21 @@
325 CLANG_CXX_LIBRARY = "libc++";
367 CLANG_CXX_LIBRARY = "libc++";
326 CLANG_ENABLE_MODULES = YES;
368 CLANG_ENABLE_MODULES = YES;
327 CLANG_ENABLE_OBJC_ARC = YES;
369 CLANG_ENABLE_OBJC_ARC = YES;
370+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
328 CLANG_WARN_BOOL_CONVERSION = YES;
371 CLANG_WARN_BOOL_CONVERSION = YES;
372+ CLANG_WARN_COMMA = YES;
329 CLANG_WARN_CONSTANT_CONVERSION = YES;
373 CLANG_WARN_CONSTANT_CONVERSION = YES;
330 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
374 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
331 CLANG_WARN_EMPTY_BODY = YES;
375 CLANG_WARN_EMPTY_BODY = YES;
332 CLANG_WARN_ENUM_CONVERSION = YES;
376 CLANG_WARN_ENUM_CONVERSION = YES;
377+ CLANG_WARN_INFINITE_RECURSION = YES;
333 CLANG_WARN_INT_CONVERSION = YES;
378 CLANG_WARN_INT_CONVERSION = YES;
379+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
380+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
334 CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
381 CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
382+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
383+ CLANG_WARN_STRICT_PROTOTYPES = YES;
384+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
335 CLANG_WARN_UNREACHABLE_CODE = YES;
385 CLANG_WARN_UNREACHABLE_CODE = YES;
336 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
386 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
337 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
387 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -350,6 +400,7 @@
350 IPHONEOS_DEPLOYMENT_TARGET = 8.4;
400 IPHONEOS_DEPLOYMENT_TARGET = 8.4;
351 MTL_ENABLE_DEBUG_INFO = NO;
401 MTL_ENABLE_DEBUG_INFO = NO;
352 SDKROOT = iphoneos;
402 SDKROOT = iphoneos;
403+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
353 VALIDATE_PRODUCT = YES;
404 VALIDATE_PRODUCT = YES;
354 };
405 };
355 name = Release;
406 name = Release;
@@ -358,10 +409,13 @@
358 isa = XCBuildConfiguration;
409 isa = XCBuildConfiguration;
359 buildSettings = {
410 buildSettings = {
360 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
411 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
412+ DEVELOPMENT_TEAM = 289M6XEDV4;
361 INFOPLIST_FILE = GMStepperExample/Info.plist;
413 INFOPLIST_FILE = GMStepperExample/Info.plist;
362 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
414 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
363 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
415 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
364 PRODUCT_NAME = "$(TARGET_NAME)";
416 PRODUCT_NAME = "$(TARGET_NAME)";
417+ SWIFT_SWIFT3_OBJC_INFERENCE = Default;
418+ SWIFT_VERSION = 4.0;
365 };
419 };
366 name = Debug;
420 name = Debug;
367 };
421 };
@@ -369,75 +423,42 @@
369 isa = XCBuildConfiguration;
423 isa = XCBuildConfiguration;
370 buildSettings = {
424 buildSettings = {
371 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
425 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
426+ DEVELOPMENT_TEAM = 289M6XEDV4;
372 INFOPLIST_FILE = GMStepperExample/Info.plist;
427 INFOPLIST_FILE = GMStepperExample/Info.plist;
373 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
428 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
374 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
429 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
375 PRODUCT_NAME = "$(TARGET_NAME)";
430 PRODUCT_NAME = "$(TARGET_NAME)";
376− };
431+ SWIFT_SWIFT3_OBJC_INFERENCE = Default;
377− name = Release;
432+ SWIFT_VERSION = 4.0;
378− };
379− 319C19551B4843EB005EFEE5 /* Debug */ = {
380− isa = XCBuildConfiguration;
381− buildSettings = {
382− BUNDLE_LOADER = "$(TEST_HOST)";
383− FRAMEWORK_SEARCH_PATHS = (
384− "$(SDKROOT)/Developer/Library/Frameworks",
385− "$(inherited)",
386− );
387− GCC_PREPROCESSOR_DEFINITIONS = (
388− "DEBUG=1",
389− "$(inherited)",
390− );
391− INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
392− LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
393− PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
394− PRODUCT_NAME = "$(TARGET_NAME)";
395− TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
396− };
397− name = Debug;
398− };
399− 319C19561B4843EB005EFEE5 /* Release */ = {
400− isa = XCBuildConfiguration;
401− buildSettings = {
402− BUNDLE_LOADER = "$(TEST_HOST)";
403− FRAMEWORK_SEARCH_PATHS = (
404− "$(SDKROOT)/Developer/Library/Frameworks",
405− "$(inherited)",
406− );
407− INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
408− LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
409− PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
410− PRODUCT_NAME = "$(TARGET_NAME)";
411− TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
412 };
433 };
413 name = Release;
434 name = Release;
414 };
435 };
415/* End XCBuildConfiguration section */
436/* End XCBuildConfiguration section */
416
437
417/* Begin XCConfigurationList section */
438/* Begin XCConfigurationList section */
418− 319C192D1B4843EB005EFEE5 /* Build configuration list for PBXProject "GMStepperExample" */ = {
439+ 3116C0DF1DA4DD360015AC69 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */ = {
419 isa = XCConfigurationList;
440 isa = XCConfigurationList;
420 buildConfigurations = (
441 buildConfigurations = (
421− 319C194F1B4843EB005EFEE5 /* Debug */,
442+ 3116C0E01DA4DD360015AC69 /* Debug */,
422− 319C19501B4843EB005EFEE5 /* Release */,
443+ 3116C0E11DA4DD360015AC69 /* Release */,
423 );
444 );
424 defaultConfigurationIsVisible = 0;
445 defaultConfigurationIsVisible = 0;
425 defaultConfigurationName = Release;
446 defaultConfigurationName = Release;
426 };
447 };
427− 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */ = {
448+ 319C192D1B4843EB005EFEE5 /* Build configuration list for PBXProject "GMStepperExample" */ = {
428 isa = XCConfigurationList;
449 isa = XCConfigurationList;
429 buildConfigurations = (
450 buildConfigurations = (
430− 319C19521B4843EB005EFEE5 /* Debug */,
451+ 319C194F1B4843EB005EFEE5 /* Debug */,
431− 319C19531B4843EB005EFEE5 /* Release */,
452+ 319C19501B4843EB005EFEE5 /* Release */,
432 );
453 );
433 defaultConfigurationIsVisible = 0;
454 defaultConfigurationIsVisible = 0;
434 defaultConfigurationName = Release;
455 defaultConfigurationName = Release;
435 };
456 };
436− 319C19541B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */ = {
457+ 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */ = {
437 isa = XCConfigurationList;
458 isa = XCConfigurationList;
438 buildConfigurations = (
459 buildConfigurations = (
439− 319C19551B4843EB005EFEE5 /* Debug */,
460+ 319C19521B4843EB005EFEE5 /* Debug */,
440− 319C19561B4843EB005EFEE5 /* Release */,
461+ 319C19531B4843EB005EFEE5 /* Release */,
441 );
462 );
442 defaultConfigurationIsVisible = 0;
463 defaultConfigurationIsVisible = 0;
443 defaultConfigurationName = Release;
464 defaultConfigurationName = Release;
GMStepperExample/GMStepperExample/AppDelegate.swift+10−10
@@ -14,33 +14,33 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
14 var window: UIWindow?
14 var window: UIWindow?
15
15
16
16
17− func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
17+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 // Override point for customization after application launch.
18 // Override point for customization after application launch.
19 return true
19 return true
20 }
20 }
21
21
22− func applicationWillResignActive(application: UIApplication) {
22+ func applicationWillResignActive(_ application: UIApplication) {
23 // 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.
23 // 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.
25 }
25 }
26
26
27− func applicationDidEnterBackground(application: UIApplication) {
27+ func applicationDidEnterBackground(_ application: UIApplication) {
28 // 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.
28 // 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.
29 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
29 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 }
30 }
31
31
32− func applicationWillEnterForeground(application: UIApplication) {
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.
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.
34 }
34 }
35
35
36− func applicationDidBecomeActive(application: UIApplication) {
36+ func applicationDidBecomeActive(_ application: UIApplication) {
37 // 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.
37 // 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.
38 }
38 }
39
39
40− func applicationWillTerminate(application: UIApplication) {
40+ func applicationWillTerminate(_ application: UIApplication) {
41 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
41 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 }
42 }
43−
43+
44−
44+
45}
45}
46
46
GMStepperExample/GMStepperExample/Base.lproj/Main.storyboard+63−32
@@ -1,9 +1,10 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2−<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8191" systemVersion="15A279b" 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">
3 <dependencies>
3 <dependencies>
4 <deployment identifier="iOS"/>
4 <deployment identifier="iOS"/>
5− <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
5+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
6 <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
6 <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
7+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
7 </dependencies>
8 </dependencies>
8 <scenes>
9 <scenes>
9 <!--View Controller-->
10 <!--View Controller-->
@@ -15,13 +16,11 @@
15 <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
16 <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
16 </layoutGuides>
17 </layoutGuides>
17 <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
18 <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"/>
19 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
20 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
20 <subviews>
21 <subviews>
21 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="AU6-4C-B2F" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
22 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="AU6-4C-B2F" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
22− <rect key="frame" x="24" y="28" width="552" height="44"/>
23− <animations/>
24− <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"/>
25 <constraints>
24 <constraints>
26 <constraint firstAttribute="height" constant="44" id="6mC-hP-wFD"/>
25 <constraint firstAttribute="height" constant="44" id="6mC-hP-wFD"/>
27 </constraints>
26 </constraints>
@@ -35,28 +34,26 @@
35 </userDefinedRuntimeAttributes>
34 </userDefinedRuntimeAttributes>
36 </view>
35 </view>
37 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="if7-U5-bAM" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
36 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="if7-U5-bAM" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
38− <rect key="frame" x="140" y="116" width="320" height="66"/>
39− <animations/>
40− <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"/>
41 <constraints>
38 <constraints>
42 <constraint firstAttribute="height" constant="66" id="iQi-6P-vt9"/>
39 <constraint firstAttribute="height" constant="66" id="iQi-6P-vt9"/>
43 <constraint firstAttribute="width" constant="320" id="ji4-Pf-1fZ"/>
40 <constraint firstAttribute="width" constant="320" id="ji4-Pf-1fZ"/>
44 </constraints>
41 </constraints>
45 <userDefinedRuntimeAttributes>
42 <userDefinedRuntimeAttributes>
46 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
43 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
47− <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"/>
48 </userDefinedRuntimeAttribute>
45 </userDefinedRuntimeAttribute>
49 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
46 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
50− <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"/>
51 </userDefinedRuntimeAttribute>
48 </userDefinedRuntimeAttribute>
52 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
49 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
53− <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"/>
54 </userDefinedRuntimeAttribute>
51 </userDefinedRuntimeAttribute>
55 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
52 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
56− <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"/>
57 </userDefinedRuntimeAttribute>
54 </userDefinedRuntimeAttribute>
58 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
55 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
59− <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"/>
60 </userDefinedRuntimeAttribute>
57 </userDefinedRuntimeAttribute>
61 <userDefinedRuntimeAttribute type="number" keyPath="stepValue">
58 <userDefinedRuntimeAttribute type="number" keyPath="stepValue">
62 <real key="value" value="0.5"/>
59 <real key="value" value="0.5"/>
@@ -64,51 +61,47 @@
64 </userDefinedRuntimeAttributes>
61 </userDefinedRuntimeAttributes>
65 </view>
62 </view>
66 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R9n-I0-fq7" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
63 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R9n-I0-fq7" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
67− <rect key="frame" x="200" y="226" width="200" height="66"/>
68− <animations/>
69− <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"/>
70 <constraints>
65 <constraints>
71 <constraint firstAttribute="width" constant="200" id="dVu-w0-mf0"/>
66 <constraint firstAttribute="width" constant="200" id="dVu-w0-mf0"/>
72 <constraint firstAttribute="height" constant="66" id="ie8-vl-NAV"/>
67 <constraint firstAttribute="height" constant="66" id="ie8-vl-NAV"/>
73 </constraints>
68 </constraints>
74 <userDefinedRuntimeAttributes>
69 <userDefinedRuntimeAttributes>
75 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
70 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
76− <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"/>
77 </userDefinedRuntimeAttribute>
72 </userDefinedRuntimeAttribute>
78 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
73 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
79− <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"/>
80 </userDefinedRuntimeAttribute>
75 </userDefinedRuntimeAttribute>
81 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
76 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
82− <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"/>
83 </userDefinedRuntimeAttribute>
78 </userDefinedRuntimeAttribute>
84 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
79 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
85− <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"/>
86 </userDefinedRuntimeAttribute>
81 </userDefinedRuntimeAttribute>
87 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
82 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
88− <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"/>
89 </userDefinedRuntimeAttribute>
84 </userDefinedRuntimeAttribute>
90 </userDefinedRuntimeAttributes>
85 </userDefinedRuntimeAttributes>
91 </view>
86 </view>
92 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="U8X-8Z-7Mo" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
87 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="U8X-8Z-7Mo" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
93− <rect key="frame" x="24" y="336" width="552" height="44"/>
94− <animations/>
95− <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"/>
96 <constraints>
89 <constraints>
97 <constraint firstAttribute="height" constant="44" id="aF3-T7-dIP"/>
90 <constraint firstAttribute="height" constant="44" id="aF3-T7-dIP"/>
98 <constraint firstAttribute="width" constant="200" id="vhP-7K-vOu"/>
91 <constraint firstAttribute="width" constant="200" id="vhP-7K-vOu"/>
99 </constraints>
92 </constraints>
100 <userDefinedRuntimeAttributes>
93 <userDefinedRuntimeAttributes>
101 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
94 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
102− <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"/>
103 </userDefinedRuntimeAttribute>
96 </userDefinedRuntimeAttribute>
104 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
97 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
105− <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"/>
106 </userDefinedRuntimeAttribute>
99 </userDefinedRuntimeAttribute>
107 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
100 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
108− <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"/>
109 </userDefinedRuntimeAttribute>
102 </userDefinedRuntimeAttribute>
110 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
103 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
111− <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"/>
112 </userDefinedRuntimeAttribute>
105 </userDefinedRuntimeAttribute>
113 <userDefinedRuntimeAttribute type="number" keyPath="labelWidthWeight">
106 <userDefinedRuntimeAttribute type="number" keyPath="labelWidthWeight">
114 <real key="value" value="0.69999999999999996"/>
107 <real key="value" value="0.69999999999999996"/>
@@ -119,7 +112,7 @@
119 <integer key="value" value="0"/>
112 <integer key="value" value="0"/>
120 </userDefinedRuntimeAttribute>
113 </userDefinedRuntimeAttribute>
121 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
114 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
122− <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"/>
123 </userDefinedRuntimeAttribute>
116 </userDefinedRuntimeAttribute>
124 <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
117 <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
125 <integer key="value" value="100"/>
118 <integer key="value" value="100"/>
@@ -131,9 +124,44 @@
131 </mask>
124 </mask>
132 </variation>
125 </variation>
133 </view>
126 </view>
127+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9Ri-Yr-sRs" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
128+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
129+ <constraints>
130+ <constraint firstAttribute="width" constant="180" id="dhO-Nd-SFk"/>
131+ <constraint firstAttribute="height" constant="50" id="xPS-vU-cZc"/>
132+ </constraints>
133+ <userDefinedRuntimeAttributes>
134+ <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
135+ <real key="value" value="10"/>
136+ </userDefinedRuntimeAttribute>
137+ <userDefinedRuntimeAttribute type="number" keyPath="stepValue">
138+ <real key="value" value="1"/>
139+ </userDefinedRuntimeAttribute>
140+ <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
141+ <real key="value" value="2"/>
142+ </userDefinedRuntimeAttribute>
143+ <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
144+ <real key="value" value="4"/>
145+ </userDefinedRuntimeAttribute>
146+ <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
147+ <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
148+ </userDefinedRuntimeAttribute>
149+ <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
150+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
151+ </userDefinedRuntimeAttribute>
152+ <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
153+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
154+ </userDefinedRuntimeAttribute>
155+ <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
156+ <color key="value" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
157+ </userDefinedRuntimeAttribute>
158+ <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
159+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
160+ </userDefinedRuntimeAttribute>
161+ </userDefinedRuntimeAttributes>
162+ </view>
134 </subviews>
163 </subviews>
135− <animations/>
136− <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"/>
137 <constraints>
165 <constraints>
138 <constraint firstItem="R9n-I0-fq7" firstAttribute="centerX" secondItem="U8X-8Z-7Mo" secondAttribute="centerX" id="3cD-WW-Qg4"/>
166 <constraint firstItem="R9n-I0-fq7" firstAttribute="centerX" secondItem="U8X-8Z-7Mo" secondAttribute="centerX" id="3cD-WW-Qg4"/>
139 <constraint firstItem="if7-U5-bAM" firstAttribute="top" secondItem="AU6-4C-B2F" secondAttribute="bottom" constant="44" id="662-W9-CUn"/>
167 <constraint firstItem="if7-U5-bAM" firstAttribute="top" secondItem="AU6-4C-B2F" secondAttribute="bottom" constant="44" id="662-W9-CUn"/>
@@ -143,7 +171,9 @@
143 <constraint firstItem="if7-U5-bAM" firstAttribute="centerX" secondItem="R9n-I0-fq7" secondAttribute="centerX" id="K7g-rC-ehJ"/>
171 <constraint firstItem="if7-U5-bAM" firstAttribute="centerX" secondItem="R9n-I0-fq7" secondAttribute="centerX" id="K7g-rC-ehJ"/>
144 <constraint firstItem="U8X-8Z-7Mo" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" constant="8" id="S1b-pD-UXA"/>
172 <constraint firstItem="U8X-8Z-7Mo" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" constant="8" id="S1b-pD-UXA"/>
145 <constraint firstItem="U8X-8Z-7Mo" firstAttribute="top" secondItem="R9n-I0-fq7" secondAttribute="bottom" constant="44" id="fBW-Xx-pa0"/>
173 <constraint firstItem="U8X-8Z-7Mo" firstAttribute="top" secondItem="R9n-I0-fq7" secondAttribute="bottom" constant="44" id="fBW-Xx-pa0"/>
174+ <constraint firstItem="9Ri-Yr-sRs" firstAttribute="centerX" secondItem="kh9-bI-dsS" secondAttribute="centerX" id="fay-qT-jKR"/>
146 <constraint firstItem="AU6-4C-B2F" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" constant="8" id="iIM-b2-jzV"/>
175 <constraint firstItem="AU6-4C-B2F" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" constant="8" id="iIM-b2-jzV"/>
176+ <constraint firstItem="9Ri-Yr-sRs" firstAttribute="top" secondItem="U8X-8Z-7Mo" secondAttribute="bottom" constant="44" id="nKi-Fp-8B7"/>
147 <constraint firstAttribute="trailingMargin" secondItem="U8X-8Z-7Mo" secondAttribute="trailing" constant="8" id="ppd-nb-fL8"/>
177 <constraint firstAttribute="trailingMargin" secondItem="U8X-8Z-7Mo" secondAttribute="trailing" constant="8" id="ppd-nb-fL8"/>
148 <constraint firstItem="AU6-4C-B2F" firstAttribute="top" secondItem="jyV-Pf-zRb" secondAttribute="bottom" constant="8" symbolic="YES" id="zDK-gF-kms"/>
178 <constraint firstItem="AU6-4C-B2F" firstAttribute="top" secondItem="jyV-Pf-zRb" secondAttribute="bottom" constant="8" symbolic="YES" id="zDK-gF-kms"/>
149 </constraints>
179 </constraints>
@@ -154,6 +184,7 @@
154 </viewController>
184 </viewController>
155 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
185 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
156 </objects>
186 </objects>
187+ <point key="canvasLocation" x="274" y="363"/>
157 </scene>
188 </scene>
158 </scenes>
189 </scenes>
159</document>
190</document>
GMStepperExample/GMStepperExample/ViewController.swift+2−2
@@ -13,10 +13,10 @@ class ViewController: UIViewController {
13 @IBOutlet weak var stepper: GMStepper!
13 @IBOutlet weak var stepper: GMStepper!
14 override func viewDidLoad() {
14 override func viewDidLoad() {
15 super.viewDidLoad()
15 super.viewDidLoad()
16− stepper.addTarget(self, action: "stepperValueChanged:", forControlEvents: .ValueChanged)
16+ stepper.addTarget(self, action: #selector(ViewController.stepperValueChanged), for: .valueChanged)
17 }
17 }
18
18
19− func stepperValueChanged(stepper: GMStepper) {
19+ @objc func stepperValueChanged(stepper: GMStepper) {
20 print(stepper.value, terminator: "")
20 print(stepper.value, terminator: "")
21 }
21 }
22}
22}
GMStepperExample/GMStepperExampleTests/GMStepperExampleTests.swift+3−3
@@ -6,8 +6,8 @@
6// Copyright (c) 2015 Gunay Mert Karadogan. All rights reserved.
6// Copyright (c) 2015 Gunay Mert Karadogan. All rights reserved.
7//
7//
8
8
9−import UIKit
10import XCTest
9import XCTest
10+import UIKit
11
11
12class GMStepperExampleTests: XCTestCase {
12class GMStepperExampleTests: XCTestCase {
13 var stepper: GMStepper!
13 var stepper: GMStepper!
@@ -37,6 +37,6 @@ class GMStepperExampleTests: XCTestCase {
37
37
38 XCTAssert(stepper.value == stepper.maximumValue, "Pass")
38 XCTAssert(stepper.value == stepper.maximumValue, "Pass")
39 }
39 }
40−
40+
41−
41+
42}
42}
GMStepperExample/GMStepperExampleTests/Info.plist−2
@@ -16,8 +16,6 @@
16 <string>BNDL</string>
16 <string>BNDL</string>
17 <key>CFBundleShortVersionString</key>
17 <key>CFBundleShortVersionString</key>
18 <string>1.0</string>
18 <string>1.0</string>
19− <key>CFBundleSignature</key>
20− <string>????</string>
21 <key>CFBundleVersion</key>
19 <key>CFBundleVersion</key>
22 <string>1</string>
20 <string>1</string>
23</dict>
21</dict>
README.md+17−6
@@ -5,6 +5,7 @@
5
5
6A 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/).
6A 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/).
7
7
8+
8## Screenshot
9## Screenshot
9
10
10![Screenshot_1.gif](https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.gif)
11![Screenshot_1.gif](https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.gif)
@@ -19,7 +20,7 @@ it, simply add the following lines to your Podfile:
19use_frameworks!
20use_frameworks!
20pod "GMStepper"
21pod "GMStepper"
21```
22```
22−
23+
23## Setup
24## Setup
24
25
25If you want to use storyboards, just drop a UIView into your storyboard and set its class to `GMStepper`. Then customize through the attributes inspector. Otherwise, you can write the code to initialize with frame and set the properties.
26If you want to use storyboards, just drop a UIView into your storyboard and set its class to `GMStepper`. Then customize through the attributes inspector. Otherwise, you can write the code to initialize with frame and set the properties.
@@ -27,7 +28,7 @@ If you want to use storyboards, just drop a UIView into your storyboard and set
27## Properties
28## Properties
28```swift
29```swift
29/// Current value of the stepper. Defaults to 0.
30/// Current value of the stepper. Defaults to 0.
30−var value: Double = 0
31+var value: Double = 0
31
32
32/// Minimum value. Must be less than maximumValue. Defaults to 0.
33/// Minimum value. Must be less than maximumValue. Defaults to 0.
33var minimumValue: Double = 0
34var minimumValue: Double = 0
@@ -43,7 +44,7 @@ var autorepeat: Bool = true
43
44
44/// If the value is integer, it is shown without floating point.
45/// If the value is integer, it is shown without floating point.
45var showIntegerIfDoubleIsInteger: Bool = true
46var showIntegerIfDoubleIsInteger: Bool = true
46−
47+
47/// Text on the left button. Be sure that it fits in the button. Defaults to "-".
48/// Text on the left button. Be sure that it fits in the button. Defaults to "-".
48var leftButtonText: String = "-"
49var leftButtonText: String = "-"
49
50
@@ -68,20 +69,30 @@ var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alph
68/// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
69/// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
69var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)
70var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)
70
71
72+/// Corner radius of the middle label's layer. Defaults to 0.0.
73+var labelCornerRadius: CGFloat = 0.0
74+
71/// Corner radius of the stepper's layer. Defaults to 4.0.
75/// Corner radius of the stepper's layer. Defaults to 4.0.
72var cornerRadius: CGFloat = 4.0
76var cornerRadius: CGFloat = 4.0
73
77
78+/// Border width of the stepper and middle label's layer. Defaults to 0.0.
79+var borderWidth: CGFloat = 0.0
80+
81+/// Color of the border of the stepper and middle label's layer. Defaults to clear color.
82+var borderColor: UIColor = UIColor.clearColor()
83+
74/// 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.
84/// 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.
75−var labelWidthWeight: CGFloat = 0.5
85+var labelWidthWeight: CGFloat = 0.5
76
86
77/// Color of the flashing animation on the buttons in case the value hit the limit.
87/// Color of the flashing animation on the buttons in case the value hit the limit.
78var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
88var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
79```
89```
80
90
81
91
82−## Author
92+## Authors
83
93
94+* [Brent Whitman](https://github.com/bwhtmn) - Maintainer
84−Günay Mert Karadoğan, mertkaradogan@gmail.com
95+* [Günay Mert Karadoğan](https://github.com/gmertk) - Creator
85
96
86## License
97## License
87
98