on bc19953 help sign in
11 files changed+248−320
since splitsnapshots
unifiedsplit
.gitignore−2 .swift-version−1 GMStepper.podspec+2−2 GMStepper/GMStepper.swift+78−121 GMStepperExample/GMStepperExample.xcodeproj/project.pbxproj+111−132 GMStepperExample/GMStepperExample/AppDelegate.swift+10−10 GMStepperExample/GMStepperExample/Base.lproj/Main.storyboard+34−30 GMStepperExample/GMStepperExample/ViewController.swift+2−2 GMStepperExample/GMStepperExampleTests/GMStepperExampleTests.swift+3−3 GMStepperExample/GMStepperExampleTests/Info.plist+2 README.md+6−17
.gitignore−2
@@ -31,5 +31,3 @@ DerivedData
3131# Carthage/Checkouts
3232
3333Carthage/Build
34−
35−.DS_Store
.swift-versiondeleted−1
@@ -1 +0,0 @@
1−4.0
GMStepper.podspec+2−2
@@ -1,9 +1,9 @@
11Pod::Spec.new do |s|
22 s.name = "GMStepper"
3− s.version = "2.1"
3+ s.version = "1.1.0"
44 s.summary = "A stepper with a sliding label in the middle."
55 s.homepage = "https://github.com/gmertk/GMStepper"
6− s.screenshots = "https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.gif"
6+ s.screenshots = "https://dl.dropboxusercontent.com/u/4397140/pod-screenshots/screenshot_1.png"
77 s.license = 'MIT'
88 s.author = { "Gunay Mert Karadogan" => "mertkaradogan@gmail.com" }
99 s.source = { :git => "https://github.com/gmertk/GMStepper.git", :tag => s.version.to_s }
GMStepper/GMStepper.swift+78−121
@@ -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() {
GMStepperExample/GMStepperExample.xcodeproj/project.pbxproj+111−132
@@ -7,18 +7,18 @@
77 objects = {
88
99/* Begin PBXBuildFile section */
10− 3116C0DB1DA4DD360015AC69 /* GMStepperExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3116C0DA1DA4DD360015AC69 /* GMStepperExampleTests.swift */; };
11− 3198AC771DA4DEE500311FB3 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
10+ 3169DD3E1B496C33009791D1 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
1211 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19371B4843EB005EFEE5 /* AppDelegate.swift */; };
1312 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19391B4843EB005EFEE5 /* ViewController.swift */; };
1413 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 319C193B1B4843EB005EFEE5 /* Main.storyboard */; };
1514 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 319C193E1B4843EB005EFEE5 /* Images.xcassets */; };
1615 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 319C19401B4843EB005EFEE5 /* LaunchScreen.xib */; };
16+ 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */; };
1717 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
1818/* End PBXBuildFile section */
1919
2020/* Begin PBXContainerItemProxy section */
21− 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */ = {
21+ 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */ = {
2222 isa = PBXContainerItemProxy;
2323 containerPortal = 319C192A1B4843EB005EFEE5 /* Project object */;
2424 proxyType = 1;
@@ -28,9 +28,6 @@
2828/* End PBXContainerItemProxy section */
2929
3030/* Begin PBXFileReference section */
31− 3116C0D81DA4DD360015AC69 /* GMStepperExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GMStepperExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
32− 3116C0DA1DA4DD360015AC69 /* GMStepperExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GMStepperExampleTests.swift; sourceTree = "<group>"; };
33− 3116C0DC1DA4DD360015AC69 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3431 319C19321B4843EB005EFEE5 /* GMStepperExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GMStepperExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
3532 319C19361B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3633 319C19371B4843EB005EFEE5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -38,18 +35,21 @@
3835 319C193C1B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
3936 319C193E1B4843EB005EFEE5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
4037 319C19411B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
38+ 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GMStepperExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
39+ 319C194C1B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
40+ 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GMStepperExampleTests.swift; sourceTree = "<group>"; };
4141 319C195B1B48445E005EFEE5 /* GMStepper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GMStepper.swift; sourceTree = "<group>"; };
4242/* End PBXFileReference section */
4343
4444/* Begin PBXFrameworksBuildPhase section */
45− 3116C0D51DA4DD360015AC69 /* Frameworks */ = {
45+ 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
4646 isa = PBXFrameworksBuildPhase;
4747 buildActionMask = 2147483647;
4848 files = (
4949 );
5050 runOnlyForDeploymentPostprocessing = 0;
5151 };
52− 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
52+ 319C19441B4843EB005EFEE5 /* Frameworks */ = {
5353 isa = PBXFrameworksBuildPhase;
5454 buildActionMask = 2147483647;
5555 files = (
@@ -59,21 +59,12 @@
5959/* End PBXFrameworksBuildPhase section */
6060
6161/* Begin PBXGroup section */
62− 3116C0D91DA4DD360015AC69 /* GMStepperExampleTests */ = {
63− isa = PBXGroup;
64− children = (
65− 3116C0DA1DA4DD360015AC69 /* GMStepperExampleTests.swift */,
66− 3116C0DC1DA4DD360015AC69 /* Info.plist */,
67− );
68− path = GMStepperExampleTests;
69− sourceTree = "<group>";
70− };
7162 319C19291B4843EB005EFEE5 = {
7263 isa = PBXGroup;
7364 children = (
7465 319C195A1B48445E005EFEE5 /* GMStepper */,
7566 319C19341B4843EB005EFEE5 /* GMStepperExample */,
76− 3116C0D91DA4DD360015AC69 /* GMStepperExampleTests */,
67+ 319C194A1B4843EB005EFEE5 /* GMStepperExampleTests */,
7768 319C19331B4843EB005EFEE5 /* Products */,
7869 );
7970 sourceTree = "<group>";
@@ -82,7 +73,7 @@
8273 isa = PBXGroup;
8374 children = (
8475 319C19321B4843EB005EFEE5 /* GMStepperExample.app */,
85− 3116C0D81DA4DD360015AC69 /* GMStepperExampleTests.xctest */,
76+ 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */,
8677 );
8778 name = Products;
8879 sourceTree = "<group>";
@@ -108,6 +99,23 @@
10899 name = "Supporting Files";
109100 sourceTree = "<group>";
110101 };
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+ };
111119 319C195A1B48445E005EFEE5 /* GMStepper */ = {
112120 isa = PBXGroup;
113121 children = (
@@ -120,24 +128,6 @@
120128/* End PBXGroup section */
121129
122130/* 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− };
141131 319C19311B4843EB005EFEE5 /* GMStepperExample */ = {
142132 isa = PBXNativeTarget;
143133 buildConfigurationList = 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */;
@@ -155,6 +145,24 @@
155145 productReference = 319C19321B4843EB005EFEE5 /* GMStepperExample.app */;
156146 productType = "com.apple.product-type.application";
157147 };
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+ };
158166/* End PBXNativeTarget section */
159167
160168/* Begin PBXProject section */
@@ -162,20 +170,16 @@
162170 isa = PBXProject;
163171 attributes = {
164172 LastSwiftMigration = 0700;
165− LastSwiftUpdateCheck = 0800;
166− LastUpgradeCheck = 0900;
173+ LastSwiftUpdateCheck = 0700;
174+ LastUpgradeCheck = 0700;
167175 ORGANIZATIONNAME = "Gunay Mert Karadogan";
168176 TargetAttributes = {
169− 3116C0D71DA4DD360015AC69 = {
170− CreatedOnToolsVersion = 8.0;
171− LastSwiftMigration = 0900;
172− ProvisioningStyle = Automatic;
173− TestTargetID = 319C19311B4843EB005EFEE5;
174− };
175177 319C19311B4843EB005EFEE5 = {
176178 CreatedOnToolsVersion = 6.4;
177− DevelopmentTeam = 289M6XEDV4;
178− LastSwiftMigration = 0900;
179+ };
180+ 319C19461B4843EB005EFEE5 = {
181+ CreatedOnToolsVersion = 6.4;
182+ TestTargetID = 319C19311B4843EB005EFEE5;
179183 };
180184 };
181185 };
@@ -193,58 +197,58 @@
193197 projectRoot = "";
194198 targets = (
195199 319C19311B4843EB005EFEE5 /* GMStepperExample */,
196− 3116C0D71DA4DD360015AC69 /* GMStepperExampleTests */,
200+ 319C19461B4843EB005EFEE5 /* GMStepperExampleTests */,
197201 );
198202 };
199203/* End PBXProject section */
200204
201205/* Begin PBXResourcesBuildPhase section */
202− 3116C0D61DA4DD360015AC69 /* Resources */ = {
206+ 319C19301B4843EB005EFEE5 /* Resources */ = {
203207 isa = PBXResourcesBuildPhase;
204208 buildActionMask = 2147483647;
205209 files = (
210+ 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
211+ 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
212+ 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
206213 );
207214 runOnlyForDeploymentPostprocessing = 0;
208215 };
209− 319C19301B4843EB005EFEE5 /* Resources */ = {
216+ 319C19451B4843EB005EFEE5 /* Resources */ = {
210217 isa = PBXResourcesBuildPhase;
211218 buildActionMask = 2147483647;
212219 files = (
213− 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
214− 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
215− 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
216220 );
217221 runOnlyForDeploymentPostprocessing = 0;
218222 };
219223/* End PBXResourcesBuildPhase section */
220224
221225/* Begin PBXSourcesBuildPhase section */
222− 3116C0D41DA4DD360015AC69 /* Sources */ = {
226+ 319C192E1B4843EB005EFEE5 /* Sources */ = {
223227 isa = PBXSourcesBuildPhase;
224228 buildActionMask = 2147483647;
225229 files = (
226− 3116C0DB1DA4DD360015AC69 /* GMStepperExampleTests.swift in Sources */,
227− 3198AC771DA4DEE500311FB3 /* GMStepper.swift in Sources */,
230+ 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
231+ 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
232+ 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
228233 );
229234 runOnlyForDeploymentPostprocessing = 0;
230235 };
231− 319C192E1B4843EB005EFEE5 /* Sources */ = {
236+ 319C19431B4843EB005EFEE5 /* Sources */ = {
232237 isa = PBXSourcesBuildPhase;
233238 buildActionMask = 2147483647;
234239 files = (
235− 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
236− 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
237− 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
240+ 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */,
241+ 3169DD3E1B496C33009791D1 /* GMStepper.swift in Sources */,
238242 );
239243 runOnlyForDeploymentPostprocessing = 0;
240244 };
241245/* End PBXSourcesBuildPhase section */
242246
243247/* Begin PBXTargetDependency section */
244− 3116C0DE1DA4DD360015AC69 /* PBXTargetDependency */ = {
248+ 319C19491B4843EB005EFEE5 /* PBXTargetDependency */ = {
245249 isa = PBXTargetDependency;
246250 target = 319C19311B4843EB005EFEE5 /* GMStepperExample */;
247− targetProxy = 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */;
251+ targetProxy = 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */;
248252 };
249253/* End PBXTargetDependency section */
250254
@@ -268,44 +272,6 @@
268272/* End PBXVariantGroup section */
269273
270274/* 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− };
309275 319C194F1B4843EB005EFEE5 /* Debug */ = {
310276 isa = XCBuildConfiguration;
311277 buildSettings = {
@@ -314,21 +280,13 @@
314280 CLANG_CXX_LIBRARY = "libc++";
315281 CLANG_ENABLE_MODULES = YES;
316282 CLANG_ENABLE_OBJC_ARC = YES;
317− CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
318283 CLANG_WARN_BOOL_CONVERSION = YES;
319− CLANG_WARN_COMMA = YES;
320284 CLANG_WARN_CONSTANT_CONVERSION = YES;
321285 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
322286 CLANG_WARN_EMPTY_BODY = YES;
323287 CLANG_WARN_ENUM_CONVERSION = YES;
324− CLANG_WARN_INFINITE_RECURSION = YES;
325288 CLANG_WARN_INT_CONVERSION = YES;
326− CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
327− CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
328289 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;
332290 CLANG_WARN_UNREACHABLE_CODE = YES;
333291 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
334292 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -367,21 +325,13 @@
367325 CLANG_CXX_LIBRARY = "libc++";
368326 CLANG_ENABLE_MODULES = YES;
369327 CLANG_ENABLE_OBJC_ARC = YES;
370− CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
371328 CLANG_WARN_BOOL_CONVERSION = YES;
372− CLANG_WARN_COMMA = YES;
373329 CLANG_WARN_CONSTANT_CONVERSION = YES;
374330 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
375331 CLANG_WARN_EMPTY_BODY = YES;
376332 CLANG_WARN_ENUM_CONVERSION = YES;
377− CLANG_WARN_INFINITE_RECURSION = YES;
378333 CLANG_WARN_INT_CONVERSION = YES;
379− CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
380− CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
381334 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;
385335 CLANG_WARN_UNREACHABLE_CODE = YES;
386336 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
387337 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -400,7 +350,6 @@
400350 IPHONEOS_DEPLOYMENT_TARGET = 8.4;
401351 MTL_ENABLE_DEBUG_INFO = NO;
402352 SDKROOT = iphoneos;
403− SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
404353 VALIDATE_PRODUCT = YES;
405354 };
406355 name = Release;
@@ -409,13 +358,10 @@
409358 isa = XCBuildConfiguration;
410359 buildSettings = {
411360 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
412− DEVELOPMENT_TEAM = 289M6XEDV4;
413361 INFOPLIST_FILE = GMStepperExample/Info.plist;
414362 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
415363 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
416364 PRODUCT_NAME = "$(TARGET_NAME)";
417− SWIFT_SWIFT3_OBJC_INFERENCE = Default;
418− SWIFT_VERSION = 4.0;
419365 };
420366 name = Debug;
421367 };
@@ -423,28 +369,52 @@
423369 isa = XCBuildConfiguration;
424370 buildSettings = {
425371 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
426− DEVELOPMENT_TEAM = 289M6XEDV4;
427372 INFOPLIST_FILE = GMStepperExample/Info.plist;
428373 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
429374 PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
430375 PRODUCT_NAME = "$(TARGET_NAME)";
431− SWIFT_SWIFT3_OBJC_INFERENCE = Default;
432− SWIFT_VERSION = 4.0;
376+ };
377+ name = Release;
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";
433412 };
434413 name = Release;
435414 };
436415/* End XCBuildConfiguration section */
437416
438417/* Begin XCConfigurationList section */
439− 3116C0DF1DA4DD360015AC69 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */ = {
440− isa = XCConfigurationList;
441− buildConfigurations = (
442− 3116C0E01DA4DD360015AC69 /* Debug */,
443− 3116C0E11DA4DD360015AC69 /* Release */,
444− );
445− defaultConfigurationIsVisible = 0;
446− defaultConfigurationName = Release;
447− };
448418 319C192D1B4843EB005EFEE5 /* Build configuration list for PBXProject "GMStepperExample" */ = {
449419 isa = XCConfigurationList;
450420 buildConfigurations = (
@@ -463,6 +433,15 @@
463433 defaultConfigurationIsVisible = 0;
464434 defaultConfigurationName = Release;
465435 };
436+ 319C19541B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */ = {
437+ isa = XCConfigurationList;
438+ buildConfigurations = (
439+ 319C19551B4843EB005EFEE5 /* Debug */,
440+ 319C19561B4843EB005EFEE5 /* Release */,
441+ );
442+ defaultConfigurationIsVisible = 0;
443+ defaultConfigurationName = Release;
444+ };
466445/* End XCConfigurationList section */
467446 };
468447 rootObject = 319C192A1B4843EB005EFEE5 /* Project object */;
GMStepperExample/GMStepperExample/AppDelegate.swift+10−10
@@ -14,33 +14,33 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
1414 var window: UIWindow?
1515
1616
17− func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
17+ func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
1818 // Override point for customization after application launch.
1919 return true
2020 }
2121
22− func applicationWillResignActive(_ application: UIApplication) {
22+ func applicationWillResignActive(application: UIApplication) {
2323 // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24− // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
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.
2525 }
2626
27− func applicationDidEnterBackground(_ application: UIApplication) {
27+ func applicationDidEnterBackground(application: UIApplication) {
2828 // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
2929 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
3030 }
3131
32− func applicationWillEnterForeground(_ application: UIApplication) {
33− // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
32+ func applicationWillEnterForeground(application: UIApplication) {
33+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
3434 }
3535
36− func applicationDidBecomeActive(_ application: UIApplication) {
36+ func applicationDidBecomeActive(application: UIApplication) {
3737 // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
3838 }
3939
40− func applicationWillTerminate(_ application: UIApplication) {
40+ func applicationWillTerminate(application: UIApplication) {
4141 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
4242 }
43−
44−
43+
44+
4545}
4646
GMStepperExample/GMStepperExample/Base.lproj/Main.storyboard+34−30
@@ -1,10 +1,9 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
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">
2+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10116" systemVersion="15E65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
33 <dependencies>
44 <deployment identifier="iOS"/>
5− <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
5+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
66 <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
7− <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
87 </dependencies>
98 <scenes>
109 <!--View Controller-->
@@ -16,11 +15,12 @@
1615 <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
1716 </layoutGuides>
1817 <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
19− <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
18+ <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
2019 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
2120 <subviews>
2221 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="AU6-4C-B2F" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
23− <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
22+ <rect key="frame" x="28" y="28" width="544" height="44"/>
23+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
2424 <constraints>
2525 <constraint firstAttribute="height" constant="44" id="6mC-hP-wFD"/>
2626 </constraints>
@@ -34,26 +34,27 @@
3434 </userDefinedRuntimeAttributes>
3535 </view>
3636 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="if7-U5-bAM" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
37− <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
37+ <rect key="frame" x="140" y="116" width="320" height="66"/>
38+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
3839 <constraints>
3940 <constraint firstAttribute="height" constant="66" id="iQi-6P-vt9"/>
4041 <constraint firstAttribute="width" constant="320" id="ji4-Pf-1fZ"/>
4142 </constraints>
4243 <userDefinedRuntimeAttributes>
4344 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
44− <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
45+ <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="calibratedRGB"/>
4546 </userDefinedRuntimeAttribute>
4647 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
47− <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
48+ <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="calibratedRGB"/>
4849 </userDefinedRuntimeAttribute>
4950 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
50− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
51+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
5152 </userDefinedRuntimeAttribute>
5253 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
53− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
54+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
5455 </userDefinedRuntimeAttribute>
5556 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
56− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
57+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
5758 </userDefinedRuntimeAttribute>
5859 <userDefinedRuntimeAttribute type="number" keyPath="stepValue">
5960 <real key="value" value="0.5"/>
@@ -61,47 +62,49 @@
6162 </userDefinedRuntimeAttributes>
6263 </view>
6364 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R9n-I0-fq7" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
64− <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
65+ <rect key="frame" x="200" y="226" width="200" height="66"/>
66+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
6567 <constraints>
6668 <constraint firstAttribute="width" constant="200" id="dVu-w0-mf0"/>
6769 <constraint firstAttribute="height" constant="66" id="ie8-vl-NAV"/>
6870 </constraints>
6971 <userDefinedRuntimeAttributes>
7072 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
71− <color key="value" red="0.1819814891" green="0.69426733259999995" blue="0.53024792669999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
73+ <color key="value" red="0.1819814891" green="0.69426733259999995" blue="0.53024792669999998" alpha="1" colorSpace="calibratedRGB"/>
7274 </userDefinedRuntimeAttribute>
7375 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
74− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
76+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
7577 </userDefinedRuntimeAttribute>
7678 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
77− <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
79+ <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="calibratedRGB"/>
7880 </userDefinedRuntimeAttribute>
7981 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
80− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
82+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
8183 </userDefinedRuntimeAttribute>
8284 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
83− <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
85+ <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="calibratedRGB"/>
8486 </userDefinedRuntimeAttribute>
8587 </userDefinedRuntimeAttributes>
8688 </view>
8789 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="U8X-8Z-7Mo" customClass="GMStepper" customModule="GMStepperExample" customModuleProvider="target">
88− <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
90+ <rect key="frame" x="28" y="336" width="544" height="44"/>
91+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
8992 <constraints>
9093 <constraint firstAttribute="height" constant="44" id="aF3-T7-dIP"/>
9194 <constraint firstAttribute="width" constant="200" id="vhP-7K-vOu"/>
9295 </constraints>
9396 <userDefinedRuntimeAttributes>
9497 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
95− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
98+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
9699 </userDefinedRuntimeAttribute>
97100 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
98− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
101+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
99102 </userDefinedRuntimeAttribute>
100103 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
101− <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
104+ <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
102105 </userDefinedRuntimeAttribute>
103106 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
104− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
107+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
105108 </userDefinedRuntimeAttribute>
106109 <userDefinedRuntimeAttribute type="number" keyPath="labelWidthWeight">
107110 <real key="value" value="0.69999999999999996"/>
@@ -112,7 +115,7 @@
112115 <integer key="value" value="0"/>
113116 </userDefinedRuntimeAttribute>
114117 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
115− <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
118+ <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
116119 </userDefinedRuntimeAttribute>
117120 <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
118121 <integer key="value" value="100"/>
@@ -125,7 +128,8 @@
125128 </variation>
126129 </view>
127130 <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"/>
131+ <rect key="frame" x="210" y="424" width="180" height="50"/>
132+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
129133 <constraints>
130134 <constraint firstAttribute="width" constant="180" id="dhO-Nd-SFk"/>
131135 <constraint firstAttribute="height" constant="50" id="xPS-vU-cZc"/>
@@ -144,24 +148,24 @@
144148 <real key="value" value="4"/>
145149 </userDefinedRuntimeAttribute>
146150 <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"/>
151+ <color key="value" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
148152 </userDefinedRuntimeAttribute>
149153 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
150− <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
154+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="calibratedRGB"/>
151155 </userDefinedRuntimeAttribute>
152156 <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
153− <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
157+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="calibratedRGB"/>
154158 </userDefinedRuntimeAttribute>
155159 <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"/>
160+ <color key="value" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
157161 </userDefinedRuntimeAttribute>
158162 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
159− <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
163+ <color key="value" red="1" green="0.47058823529999999" blue="0.15686274510000001" alpha="1" colorSpace="calibratedRGB"/>
160164 </userDefinedRuntimeAttribute>
161165 </userDefinedRuntimeAttributes>
162166 </view>
163167 </subviews>
164− <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
168+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
165169 <constraints>
166170 <constraint firstItem="R9n-I0-fq7" firstAttribute="centerX" secondItem="U8X-8Z-7Mo" secondAttribute="centerX" id="3cD-WW-Qg4"/>
167171 <constraint firstItem="if7-U5-bAM" firstAttribute="top" secondItem="AU6-4C-B2F" secondAttribute="bottom" constant="44" id="662-W9-CUn"/>
GMStepperExample/GMStepperExample/ViewController.swift+2−2
@@ -13,10 +13,10 @@ class ViewController: UIViewController {
1313 @IBOutlet weak var stepper: GMStepper!
1414 override func viewDidLoad() {
1515 super.viewDidLoad()
16− stepper.addTarget(self, action: #selector(ViewController.stepperValueChanged), for: .valueChanged)
16+ stepper.addTarget(self, action: "stepperValueChanged:", forControlEvents: .ValueChanged)
1717 }
1818
19− @objc func stepperValueChanged(stepper: GMStepper) {
19+ func stepperValueChanged(stepper: GMStepper) {
2020 print(stepper.value, terminator: "")
2121 }
2222}
GMStepperExample/GMStepperExampleTests/GMStepperExampleTests.swift+3−3
@@ -6,8 +6,8 @@
66// Copyright (c) 2015 Gunay Mert Karadogan. All rights reserved.
77//
88
9−import XCTest
109import UIKit
10+import XCTest
1111
1212class GMStepperExampleTests: XCTestCase {
1313 var stepper: GMStepper!
@@ -37,6 +37,6 @@ class GMStepperExampleTests: XCTestCase {
3737
3838 XCTAssert(stepper.value == stepper.maximumValue, "Pass")
3939 }
40−
41−
40+
41+
4242}
GMStepperExample/GMStepperExampleTests/Info.plist+2
@@ -16,6 +16,8 @@
1616 <string>BNDL</string>
1717 <key>CFBundleShortVersionString</key>
1818 <string>1.0</string>
19+ <key>CFBundleSignature</key>
20+ <string>????</string>
1921 <key>CFBundleVersion</key>
2022 <string>1</string>
2123</dict>
README.md+6−17
@@ -5,7 +5,6 @@
55
66A stepper with a sliding label in the middle. Pan the label or tap the buttons. Check out the tutorial, [How to Build a Custom Stepper - Part 1](http://gmertk.github.io/custom-stepper-part-1/).
77
8−
98## Screenshot
109
1110![Screenshot_1.gif](https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.gif)
@@ -20,7 +19,7 @@ it, simply add the following lines to your Podfile:
2019use_frameworks!
2120pod "GMStepper"
2221```
23−
22+
2423## Setup
2524
2625If 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.
@@ -28,7 +27,7 @@ If you want to use storyboards, just drop a UIView into your storyboard and set
2827## Properties
2928```swift
3029/// Current value of the stepper. Defaults to 0.
31−var value: Double = 0
30+var value: Double = 0
3231
3332/// Minimum value. Must be less than maximumValue. Defaults to 0.
3433var minimumValue: Double = 0
@@ -44,7 +43,7 @@ var autorepeat: Bool = true
4443
4544/// If the value is integer, it is shown without floating point.
4645var showIntegerIfDoubleIsInteger: Bool = true
47−
46+
4847/// Text on the left button. Be sure that it fits in the button. Defaults to "-".
4948var leftButtonText: String = "-"
5049
@@ -69,30 +68,20 @@ var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alph
6968/// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
7069var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)
7170
72−/// Corner radius of the middle label's layer. Defaults to 0.0.
73−var labelCornerRadius: CGFloat = 0.0
74−
7571/// Corner radius of the stepper's layer. Defaults to 4.0.
7672var cornerRadius: CGFloat = 4.0
7773
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−
8474/// 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.
85−var labelWidthWeight: CGFloat = 0.5
75+var labelWidthWeight: CGFloat = 0.5
8676
8777/// Color of the flashing animation on the buttons in case the value hit the limit.
8878var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
8979```
9080
9181
92−## Authors
82+## Author
9383
94−* [Brent Whitman](https://github.com/bwhtmn) - Maintainer
95−* [Günay Mert Karadoğan](https://github.com/gmertk) - Creator
84+Günay Mert Karadoğan, mertkaradogan@gmail.com
9685
9786## License
9887