@@ -11,7 +11,7 @@ import UIKit
1111@IBDesignable public class GMStepper: UIControl {
1212
1313 /// Current value of the stepper. Defaults to 0.
14− @IBInspectable public var value: Double = 0 {
14+ @objc @IBInspectable public var value: Double = 0 {
1515 didSet {
1616 value = min(maximumValue, max(minimumValue, value))
1717
@@ -37,44 +37,44 @@ import UIKit
3737 }
3838
3939 /// Minimum value. Must be less than maximumValue. Defaults to 0.
40− @IBInspectable public var minimumValue: Double = 0 {
40+ @objc @IBInspectable public var minimumValue: Double = 0 {
4141 didSet {
4242 value = min(maximumValue, max(minimumValue, value))
4343 }
4444 }
4545
4646 /// Maximum value. Must be more than minimumValue. Defaults to 100.
47− @IBInspectable public var maximumValue: Double = 100 {
47+ @objc @IBInspectable public var maximumValue: Double = 100 {
4848 didSet {
4949 value = min(maximumValue, max(minimumValue, value))
5050 }
5151 }
5252
5353 /// Step/Increment value as in UIStepper. Defaults to 1.
54− @IBInspectable public var stepValue: Double = 1
54+ @objc @IBInspectable public var stepValue: Double = 1
5555
5656 /// The same as UIStepper's autorepeat. If true, holding on the buttons or keeping the pan gesture alters the value repeatedly. Defaults to true.
57− @IBInspectable public var autorepeat: Bool = true
57+ @objc @IBInspectable public var autorepeat: Bool = true
5858
5959 /// If the value is integer, it is shown without floating point.
60− @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
60+ @objc @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
6161
6262 /// Text on the left button. Be sure that it fits in the button. Defaults to "−".
63− @IBInspectable public var leftButtonText: String = "−" {
63+ @objc @IBInspectable public var leftButtonText: String = "−" {
6464 didSet {
6565 leftButton.setTitle(leftButtonText, for: .normal)
6666 }
6767 }
6868
6969 /// Text on the right button. Be sure that it fits in the button. Defaults to "+".
70− @IBInspectable public var rightButtonText: String = "+" {
70+ @objc @IBInspectable public var rightButtonText: String = "+" {
7171 didSet {
7272 rightButton.setTitle(rightButtonText, for: .normal)
7373 }
7474 }
7575
7676 /// Text color of the buttons. Defaults to white.
77− @IBInspectable public var buttonsTextColor: UIColor = UIColor.white {
77+ @objc @IBInspectable public var buttonsTextColor: UIColor = UIColor.white {
7878 didSet {
7979 for button in [leftButton, rightButton] {
8080 button.setTitleColor(buttonsTextColor, for: .normal)
@@ -83,7 +83,7 @@ import UIKit
8383 }
8484
8585 /// Background color of the buttons. Defaults to dark blue.
86− @IBInspectable public var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1) {
86+ @objc @IBInspectable public var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1) {
8787 didSet {
8888 for button in [leftButton, rightButton] {
8989 button.backgroundColor = buttonsBackgroundColor
@@ -93,7 +93,7 @@ import UIKit
9393 }
9494
9595 /// Font of the buttons. Defaults to AvenirNext-Bold, 20.0 points in size.
96− public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
96+ @objc public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
9797 didSet {
9898 for button in [leftButton, rightButton] {
9999 button.titleLabel?.font = buttonsFont
@@ -102,28 +102,35 @@ import UIKit
102102 }
103103
104104 /// Text color of the middle label. Defaults to white.
105− @IBInspectable public var labelTextColor: UIColor = UIColor.white {
105+ @objc @IBInspectable public var labelTextColor: UIColor = UIColor.white {
106106 didSet {
107107 label.textColor = labelTextColor
108108 }
109109 }
110110
111111 /// Text color of the middle label. Defaults to lighter blue.
112− @IBInspectable public var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1) {
112+ @objc @IBInspectable public var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1) {
113113 didSet {
114114 label.backgroundColor = labelBackgroundColor
115115 }
116116 }
117117
118118 /// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
119− public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
119+ @objc public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
120120 didSet {
121121 label.font = labelFont
122122 }
123123 }
124+ /// Corner radius of the middle label. Defaults to 0.
125+ @objc @IBInspectable public var labelCornerRadius: CGFloat = 0 {
126+ didSet {
127+ label.layer.cornerRadius = labelCornerRadius
128+
129+ }
130+ }
124131
125132 /// Corner radius of the stepper's layer. Defaults to 4.0.
126− @IBInspectable public var cornerRadius: CGFloat = 4.0 {
133+ @objc @IBInspectable public var cornerRadius: CGFloat = 4.0 {
127134 didSet {
128135 layer.cornerRadius = cornerRadius
129136 clipsToBounds = true
@@ -131,7 +138,7 @@ import UIKit
131138 }
132139
133140 /// Border width of the stepper and middle label's layer. Defaults to 0.0.
134− @IBInspectable public var borderWidth: CGFloat = 0.0 {
141+ @objc @IBInspectable public var borderWidth: CGFloat = 0.0 {
135142 didSet {
136143 layer.borderWidth = borderWidth
137144 label.layer.borderWidth = borderWidth
@@ -139,7 +146,7 @@ import UIKit
139146 }
140147
141148 /// Color of the border of the stepper and middle label's layer. Defaults to clear color.
142− @IBInspectable public var borderColor: UIColor = UIColor.clear {
149+ @objc @IBInspectable public var borderColor: UIColor = UIColor.clear {
143150 didSet {
144151 layer.borderColor = borderColor.cgColor
145152 label.layer.borderColor = borderColor.cgColor
@@ -147,7 +154,7 @@ import UIKit
147154 }
148155
149156 /// Percentage of the middle label's width. Must be between 0 and 1. Defaults to 0.5. Be sure that it is wide enough to show the value.
150− @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
157+ @objc @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
151158 didSet {
152159 labelWidthWeight = min(1, max(0, labelWidthWeight))
153160 setNeedsLayout()
@@ -155,7 +162,7 @@ import UIKit
155162 }
156163
157164 /// Color of the flashing animation on the buttons in case the value hit the limit.
158− @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
165+ @objc @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
159166
160167 /**
161168 Width of the sliding animation. When buttons clicked, the middle label does a slide animation towards to the clicked button. Defaults to 5.
@@ -177,6 +184,7 @@ import UIKit
177184 button.addTarget(self, action: #selector(GMStepper.leftButtonTouchDown), for: .touchDown)
178185 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
179186 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
187+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
180188 return button
181189 }()
182190
@@ -189,6 +197,7 @@ import UIKit
189197 button.addTarget(self, action: #selector(GMStepper.rightButtonTouchDown), for: .touchDown)
190198 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpInside)
191199 button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchUpOutside)
200+ button.addTarget(self, action: #selector(GMStepper.buttonTouchUp), for: .touchCancel)
192201 return button
193202 }()
194203
@@ -203,6 +212,8 @@ import UIKit
203212 label.textColor = self.labelTextColor
204213 label.backgroundColor = self.labelBackgroundColor
205214 label.font = self.labelFont
215+ label.layer.cornerRadius = self.labelCornerRadius
216+ label.layer.masksToBounds = true
206217 label.isUserInteractionEnabled = true
207218 let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(GMStepper.handlePan))
208219 panRecognizer.maximumNumberOfTouches = 1
@@ -234,7 +245,7 @@ import UIKit
234245 }
235246
236247
237− public var items : [String] = [] {
248+ @objc public var items : [String] = [] {
238249 didSet {
239250 let isInteger = floor(value) == value
240251
@@ -280,12 +291,12 @@ import UIKit
280291 }
281292 }
282293
283− required public init?(coder aDecoder: NSCoder) {
294+ @objc required public init?(coder aDecoder: NSCoder) {
284295 super.init(coder: aDecoder)
285296 setup()
286297 }
287298
288− public override init(frame: CGRect) {
299+ @objc public override init(frame: CGRect) {
289300 super.init(frame: frame)
290301 setup()
291302 }
@@ -298,6 +309,7 @@ import UIKit
298309 backgroundColor = buttonsBackgroundColor
299310 layer.cornerRadius = cornerRadius
300311 clipsToBounds = true
312+ labelOriginalCenter = label.center
301313
302314 NotificationCenter.default.addObserver(self, selector: #selector(GMStepper.reset), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
303315 }
@@ -344,7 +356,7 @@ import UIKit
344356
345357// MARK: Pan Gesture
346358extension GMStepper {
347− func handlePan(gesture: UIPanGestureRecognizer) {
359+ @objc func handlePan(gesture: UIPanGestureRecognizer) {
348360 switch gesture.state {
349361 case .began:
350362 leftButton.isEnabled = false
@@ -394,7 +406,7 @@ extension GMStepper {
394406 }
395407 }
396408
397− func reset() {
409+ @objc func reset() {
398410 panState = .Stable
399411 stepperState = .Stable
400412 resetTimer()
@@ -413,7 +425,7 @@ extension GMStepper {
413425
414426// MARK: Button Events
415427extension GMStepper {
416− func leftButtonTouchDown(button: UIButton) {
428+ @objc func leftButtonTouchDown(button: UIButton) {
417429 rightButton.isEnabled = false
418430 label.isUserInteractionEnabled = false
419431 resetTimer()
@@ -427,7 +439,7 @@ extension GMStepper {
427439
428440 }
429441
430− func rightButtonTouchDown(button: UIButton) {
442+ @objc func rightButtonTouchDown(button: UIButton) {
431443 leftButton.isEnabled = false
432444 label.isUserInteractionEnabled = false
433445 resetTimer()
@@ -440,7 +452,7 @@ extension GMStepper {
440452 }
441453 }
442454
443− func buttonTouchUp(button: UIButton) {
455+ @objc func buttonTouchUp(button: UIButton) {
444456 reset()
445457 }
446458}
@@ -485,7 +497,7 @@ extension GMStepper {
485497
486498// MARK: Timer
487499extension GMStepper {
488− func handleTimerFire(timer: Timer) {
500+ @objc func handleTimerFire(timer: Timer) {
489501 timerFireCount += 1
490502
491503 if timerFireCount % timerFireCountModulo == 0 {