@@ -11,79 +11,72 @@ import UIKit
1111@IBDesignable public class GMStepper: UIControl {
1212
1313 /// Current value of the stepper. Defaults to 0.
14− @objc @IBInspectable public var value: Double = 0 {
14+ @IBInspectable public var value: Double = 0 {
1515 didSet {
1616 value = min(maximumValue, max(minimumValue, value))
1717
1818 let isInteger = floor(value) == value
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− }
27− else if showIntegerIfDoubleIsInteger && isInteger {
19+
20+ if showIntegerIfDoubleIsInteger && isInteger {
2821 label.text = String(stringInterpolationSegment: Int(value))
2922 } else {
3023 label.text = String(stringInterpolationSegment: value)
3124 }
3225
3326 if oldValue != value {
34− sendActions(for: .valueChanged)
27+ sendActionsForControlEvents(.ValueChanged)
3528 }
3629 }
3730 }
3831
3932 /// Minimum value. Must be less than maximumValue. Defaults to 0.
40− @objc @IBInspectable public var minimumValue: Double = 0 {
33+ @IBInspectable public var minimumValue: Double = 0 {
4134 didSet {
4235 value = min(maximumValue, max(minimumValue, value))
4336 }
4437 }
4538
4639 /// Maximum value. Must be more than minimumValue. Defaults to 100.
47− @objc @IBInspectable public var maximumValue: Double = 100 {
40+ @IBInspectable public var maximumValue: Double = 100 {
4841 didSet {
4942 value = min(maximumValue, max(minimumValue, value))
5043 }
5144 }
5245
5346 /// Step/Increment value as in UIStepper. Defaults to 1.
54− @objc @IBInspectable public var stepValue: Double = 1
47+ @IBInspectable public var stepValue: Double = 1
5548
5649 /// 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− @objc @IBInspectable public var autorepeat: Bool = true
50+ @IBInspectable public var autorepeat: Bool = true
5851
5952 /// If the value is integer, it is shown without floating point.
60− @objc @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
53+ @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
6154
6255 /// Text on the left button. Be sure that it fits in the button. Defaults to "−".
63− @objc @IBInspectable public var leftButtonText: String = "−" {
56+ @IBInspectable public var leftButtonText: String = "−" {
6457 didSet {
65− leftButton.setTitle(leftButtonText, for: .normal)
58+ leftButton.setTitle(leftButtonText, forState: .Normal)
6659 }
6760 }
6861
6962 /// Text on the right button. Be sure that it fits in the button. Defaults to "+".
70− @objc @IBInspectable public var rightButtonText: String = "+" {
63+ @IBInspectable public var rightButtonText: String = "+" {
7164 didSet {
72− rightButton.setTitle(rightButtonText, for: .normal)
65+ rightButton.setTitle(rightButtonText, forState: .Normal)
7366 }
7467 }
7568
7669 /// Text color of the buttons. Defaults to white.
77− @objc @IBInspectable public var buttonsTextColor: UIColor = UIColor.white {
70+ @IBInspectable public var buttonsTextColor: UIColor = UIColor.whiteColor() {
7871 didSet {
7972 for button in [leftButton, rightButton] {
80− button.setTitleColor(buttonsTextColor, for: .normal)
73+ button.setTitleColor(buttonsTextColor, forState: .Normal)
8174 }
8275 }
8376 }
8477
8578 /// Background color of the buttons. Defaults to dark blue.
86− @objc @IBInspectable public var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1) {
79+ @IBInspectable public var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1) {
8780 didSet {
8881 for button in [leftButton, rightButton] {
8982 button.backgroundColor = buttonsBackgroundColor
@@ -93,7 +86,7 @@ import UIKit
9386 }
9487
9588 /// Font of the buttons. Defaults to AvenirNext-Bold, 20.0 points in size.
96− @objc public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
89+ public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
9790 didSet {
9891 for button in [leftButton, rightButton] {
9992 button.titleLabel?.font = buttonsFont
@@ -102,35 +95,28 @@ import UIKit
10295 }
10396
10497 /// Text color of the middle label. Defaults to white.
105− @objc @IBInspectable public var labelTextColor: UIColor = UIColor.white {
98+ @IBInspectable public var labelTextColor: UIColor = UIColor.whiteColor() {
10699 didSet {
107100 label.textColor = labelTextColor
108101 }
109102 }
110103
111104 /// Text color of the middle label. Defaults to lighter blue.
112− @objc @IBInspectable public var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1) {
105+ @IBInspectable public var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1) {
113106 didSet {
114107 label.backgroundColor = labelBackgroundColor
115108 }
116109 }
117110
118111 /// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
119− @objc public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
112+ public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
120113 didSet {
121114 label.font = labelFont
122115 }
123116 }
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− }
131117
132118 /// Corner radius of the stepper's layer. Defaults to 4.0.
133− @objc @IBInspectable public var cornerRadius: CGFloat = 4.0 {
119+ @IBInspectable public var cornerRadius: CGFloat = 4.0 {
134120 didSet {
135121 layer.cornerRadius = cornerRadius
136122 clipsToBounds = true
@@ -138,7 +124,7 @@ import UIKit
138124 }
139125
140126 /// Border width of the stepper and middle label's layer. Defaults to 0.0.
141− @objc @IBInspectable public var borderWidth: CGFloat = 0.0 {
127+ @IBInspectable public var borderWidth: CGFloat = 0.0 {
142128 didSet {
143129 layer.borderWidth = borderWidth
144130 label.layer.borderWidth = borderWidth
@@ -146,15 +132,15 @@ import UIKit
146132 }
147133
148134 /// 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 {
135+ @IBInspectable public var borderColor: UIColor = UIColor.clearColor() {
150136 didSet {
151− layer.borderColor = borderColor.cgColor
152− label.layer.borderColor = borderColor.cgColor
137+ layer.borderColor = borderColor.CGColor
138+ label.layer.borderColor = borderColor.CGColor
153139 }
154140 }
155141
156142 /// 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.
157− @objc @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
143+ @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
158144 didSet {
159145 labelWidthWeight = min(1, max(0, labelWidthWeight))
160146 setNeedsLayout()
@@ -162,7 +148,7 @@ import UIKit
162148 }
163149
164150 /// Color of the flashing animation on the buttons in case the value hit the limit.
165− @objc @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
151+ @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
166152
167153 /**
168154 Width of the sliding animation. When buttons clicked, the middle label does a slide animation towards to the clicked button. Defaults to 5.
@@ -170,40 +156,38 @@ import UIKit
170156 let labelSlideLength: CGFloat = 5
171157
172158 /// Duration of the sliding animation
173− let labelSlideDuration = TimeInterval(0.1)
159+ let labelSlideDuration = NSTimeInterval(0.1)
174160
175161 /// Duration of the animation when the value hits the limit.
176− let limitHitAnimationDuration = TimeInterval(0.1)
162+ let limitHitAnimationDuration = NSTimeInterval(0.1)
177163
178164 lazy var leftButton: UIButton = {
179165 let button = UIButton()
180− button.setTitle(self.leftButtonText, for: .normal)
181− button.setTitleColor(self.buttonsTextColor, for: .normal)
166+ button.setTitle(self.leftButtonText, forState: .Normal)
167+ button.setTitleColor(self.buttonsTextColor, forState: .Normal)
182168 button.backgroundColor = self.buttonsBackgroundColor
183169 button.titleLabel?.font = self.buttonsFont
184− button.addTarget(self, action: #selector(GMStepper.leftButtonTouchDown), for: .touchDown)
185− button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
186− button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
187− button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
170+ button.addTarget(self, action: "leftButtonTouchDown:", forControlEvents: .TouchDown)
171+ button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpInside)
172+ button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpOutside)
188173 return button
189174 }()
190175
191176 lazy var rightButton: UIButton = {
192177 let button = UIButton()
193− button.setTitle(self.rightButtonText, for: .normal)
194− button.setTitleColor(self.buttonsTextColor, for: .normal)
178+ button.setTitle(self.rightButtonText, forState: .Normal)
179+ button.setTitleColor(self.buttonsTextColor, forState: .Normal)
195180 button.backgroundColor = self.buttonsBackgroundColor
196181 button.titleLabel?.font = self.buttonsFont
197− button.addTarget(self, action: #selector(GMStepper.rightButtonTouchDown), for: .touchDown)
198− button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
199− button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
200− button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
182+ button.addTarget(self, action: "rightButtonTouchDown:", forControlEvents: .TouchDown)
183+ button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpInside)
184+ button.addTarget(self, action: "buttonTouchUp:", forControlEvents: UIControlEvents.TouchUpOutside)
201185 return button
202186 }()
203187
204188 lazy var label: UILabel = {
205189 let label = UILabel()
206− label.textAlignment = .center
190+ label.textAlignment = .Center
207191 if self.showIntegerIfDoubleIsInteger && floor(self.value) == self.value {
208192 label.text = String(stringInterpolationSegment: Int(self.value))
209193 } else {
@@ -212,10 +196,8 @@ import UIKit
212196 label.textColor = self.labelTextColor
213197 label.backgroundColor = self.labelBackgroundColor
214198 label.font = self.labelFont
215− label.layer.cornerRadius = self.labelCornerRadius
216− label.layer.masksToBounds = true
217− label.isUserInteractionEnabled = true
218− let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(GMStepper.handlePan))
199+ label.userInteractionEnabled = true
200+ let panRecognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
219201 panRecognizer.maximumNumberOfTouches = 1
220202 label.addGestureRecognizer(panRecognizer)
221203 return label
@@ -243,33 +225,9 @@ import UIKit
243225 }
244226 }
245227 }
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− }
270228
271229 /// Timer used for autorepeat option
272− var timer: Timer?
230+ var timer: NSTimer?
273231
274232 /** When UIStepper reaches its top speed, it alters the value with a time interval of ~0.05 sec.
275233 The user pressing and holding on the stepper repeatedly:
@@ -277,7 +235,7 @@ import UIKit
277235 - For the next 1.5 sec, it changes the value every 0.1 sec.
278236 - Then, every 0.05 sec.
279237 */
280− let timerInterval = TimeInterval(0.05)
238+ let timerInterval = NSTimeInterval(0.05)
281239
282240 /// 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.
283241 var timerFireCount = 0
@@ -291,12 +249,12 @@ import UIKit
291249 }
292250 }
293251
294− @objc required public init?(coder aDecoder: NSCoder) {
252+ required public init?(coder aDecoder: NSCoder) {
295253 super.init(coder: aDecoder)
296254 setup()
297255 }
298256
299− @objc public override init(frame: CGRect) {
257+ public override init(frame: CGRect) {
300258 super.init(frame: frame)
301259 setup()
302260 }
@@ -309,9 +267,8 @@ import UIKit
309267 backgroundColor = buttonsBackgroundColor
310268 layer.cornerRadius = cornerRadius
311269 clipsToBounds = true
312− labelOriginalCenter = label.center
313270
314− NotificationCenter.default.addObserver(self, selector: #selector(GMStepper.reset), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
271+ NSNotificationCenter.defaultCenter().addObserver(self, selector: "reset", name: UIApplicationWillResignActiveNotification, object: nil)
315272 }
316273
317274 public override func layoutSubviews() {
@@ -337,7 +294,7 @@ import UIKit
337294
338295 deinit {
339296 resetTimer()
340− NotificationCenter.default.removeObserver(self)
297+ NSNotificationCenter.defaultCenter().removeObserver(self)
341298 }
342299
343300 /// 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.
@@ -356,17 +313,17 @@ import UIKit
356313
357314// MARK: Pan Gesture
358315extension GMStepper {
359− @objc func handlePan(gesture: UIPanGestureRecognizer) {
316+ func handlePan(gesture: UIPanGestureRecognizer) {
360317 switch gesture.state {
361− case .began:
362− leftButton.isEnabled = false
363− rightButton.isEnabled = false
364− case .changed:
365− let translation = gesture.translation(in: label)
366− gesture.setTranslation(CGPoint.zero, in: label)
318+ case .Began:
319+ leftButton.enabled = false
320+ rightButton.enabled = false
321+ case .Changed:
322+ let translation = gesture.translationInView(label)
323+ gesture.setTranslation(CGPointZero, inView: label)
367324
368− let slidingRight = gesture.velocity(in: label).x > 0
369− let slidingLeft = gesture.velocity(in: label).x < 0
325+ let slidingRight = gesture.velocityInView(label).x > 0
326+ let slidingLeft = gesture.velocityInView(label).x < 0
370327
371328 // Move the label with pan
372329 if slidingRight {
@@ -399,23 +356,23 @@ extension GMStepper {
399356 self.rightButton.backgroundColor = self.buttonsBackgroundColor
400357 self.leftButton.backgroundColor = self.buttonsBackgroundColor
401358 }
402− case .ended, .cancelled, .failed:
359+ case .Ended, .Cancelled, .Failed:
403360 reset()
404361 default:
405362 break
406363 }
407364 }
408365
409− @objc func reset() {
366+ func reset() {
410367 panState = .Stable
411368 stepperState = .Stable
412369 resetTimer()
413370
414− leftButton.isEnabled = true
415− rightButton.isEnabled = true
416− label.isUserInteractionEnabled = true
371+ leftButton.enabled = true
372+ rightButton.enabled = true
373+ label.userInteractionEnabled = true
417374
418− UIView.animate(withDuration: self.labelSlideDuration, animations: {
375+ UIView.animateWithDuration(self.labelSlideDuration, animations: {
419376 self.label.center = self.labelOriginalCenter
420377 self.rightButton.backgroundColor = self.buttonsBackgroundColor
421378 self.leftButton.backgroundColor = self.buttonsBackgroundColor
@@ -425,9 +382,9 @@ extension GMStepper {
425382
426383// MARK: Button Events
427384extension GMStepper {
428− @objc func leftButtonTouchDown(button: UIButton) {
429− rightButton.isEnabled = false
430− label.isUserInteractionEnabled = false
385+ func leftButtonTouchDown(button: UIButton) {
386+ rightButton.enabled = false
387+ label.userInteractionEnabled = false
431388 resetTimer()
432389
433390 if value == minimumValue {
@@ -439,9 +396,9 @@ extension GMStepper {
439396
440397 }
441398
442− @objc func rightButtonTouchDown(button: UIButton) {
443− leftButton.isEnabled = false
444− label.isUserInteractionEnabled = false
399+ func rightButtonTouchDown(button: UIButton) {
400+ leftButton.enabled = false
401+ label.userInteractionEnabled = false
445402 resetTimer()
446403
447404 if value == maximumValue {
@@ -452,7 +409,7 @@ extension GMStepper {
452409 }
453410 }
454411
455− @objc func buttonTouchUp(button: UIButton) {
412+ func buttonTouchUp(button: UIButton) {
456413 reset()
457414 }
458415}
@@ -461,20 +418,20 @@ extension GMStepper {
461418extension GMStepper {
462419
463420 func animateSlideLeft() {
464− UIView.animate(withDuration: labelSlideDuration) {
421+ UIView.animateWithDuration(labelSlideDuration) {
465422 self.label.center.x -= self.labelSlideLength
466423 }
467424 }
468425
469426 func animateSlideRight() {
470− UIView.animate(withDuration: labelSlideDuration) {
427+ UIView.animateWithDuration(labelSlideDuration) {
471428 self.label.center.x += self.labelSlideLength
472429 }
473430 }
474431
475432 func animateToOriginalPosition() {
476433 if self.label.center != self.labelOriginalCenter {
477− UIView.animate(withDuration: labelSlideDuration) {
434+ UIView.animateWithDuration(labelSlideDuration) {
478435 self.label.center = self.labelOriginalCenter
479436 }
480437 }
@@ -482,14 +439,14 @@ extension GMStepper {
482439
483440 func animateLimitHitIfNeeded() {
484441 if value == minimumValue {
485− animateLimitHitForButton(button: leftButton)
442+ animateLimitHitForButton(leftButton)
486443 } else if value == maximumValue {
487− animateLimitHitForButton(button: rightButton)
444+ animateLimitHitForButton(rightButton)
488445 }
489446 }
490447
491448 func animateLimitHitForButton(button: UIButton){
492− UIView.animate(withDuration: limitHitAnimationDuration) {
449+ UIView.animateWithDuration(limitHitAnimationDuration) {
493450 button.backgroundColor = self.limitHitAnimationColor
494451 }
495452 }
@@ -497,7 +454,7 @@ extension GMStepper {
497454
498455// MARK: Timer
499456extension GMStepper {
500− @objc func handleTimerFire(timer: Timer) {
457+ func handleTimerFire(timer: NSTimer) {
501458 timerFireCount += 1
502459
503460 if timerFireCount % timerFireCountModulo == 0 {
@@ -506,7 +463,7 @@ extension GMStepper {
506463 }
507464
508465 func scheduleTimer() {
509− timer = Timer.scheduledTimer(timeInterval: timerInterval, target: self, selector: #selector(GMStepper.handleTimerFire), userInfo: nil, repeats: true)
466+ timer = NSTimer.scheduledTimerWithTimeInterval(timerInterval, target: self, selector: "handleTimerFire:", userInfo: nil, repeats: true)
510467 }
511468
512469 func resetTimer() {