on 2cbd8eb help sign in
15 files changed+280−770
since splitsnapshots
unifiedsplit
.gitignore−2 .swift-version−1 GMStepper.podspec+2−2 GMStepper/GMStepper.swift+93−409 GMStepperExample/GMStepperExample.xcodeproj/project.pbxproj+106−136 GMStepperExample/GMStepperExample/AppDelegate.swift+10−10 GMStepperExample/GMStepperExample/Base.lproj/LaunchScreen.xib+2−6 GMStepperExample/GMStepperExample/Base.lproj/Main.storyboard+39−79 GMStepperExample/GMStepperExample/Info.plist+1−1 GMStepperExample/GMStepperExample/ViewController.swift+5−4 GMStepperExample/GMStepperExampleTests/GMStepperExampleTests.swift+17−23 GMStepperExample/GMStepperExampleTests/Info.plist+3−1 README.md+2−96 Screenshots/screenshot_1.gif Screenshots/screenshot_1.png
.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 = "0.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+93−409
@@ -9,81 +9,50 @@
99import UIKit
1010
1111@IBDesignable public class GMStepper: UIControl {
12−
13− /// Current value of the stepper. Defaults to 0.
14− @objc @IBInspectable public var value: Double = 0 {
12+ public var value = 0 {
1513 didSet {
1614 value = min(maximumValue, max(minimumValue, value))
17−
18− let isInteger = floor(value) == value
19−
20− //
21− // If we have items, we will display them as steps
22− //
15+ label.text = String(value)
2316
24− if isInteger && stepValue == 1.0 && items.count > 0 {
25− label.text = items[Int(value)]
26− }
27− else if showIntegerIfDoubleIsInteger && isInteger {
28− label.text = String(stringInterpolationSegment: Int(value))
29− } else {
30− label.text = String(stringInterpolationSegment: value)
31− }
32−
3317 if oldValue != value {
34− sendActions(for: .valueChanged)
18+ sendActionsForControlEvents(.ValueChanged)
3519 }
3620 }
3721 }
38−
39− /// Minimum value. Must be less than maximumValue. Defaults to 0.
40− @objc @IBInspectable public var minimumValue: Double = 0 {
22+
23+ @IBInspectable public var minimumValue: Int = 0 {
4124 didSet {
42− value = min(maximumValue, max(minimumValue, value))
25+ value = 0
4326 }
4427 }
45−
46− /// Maximum value. Must be more than minimumValue. Defaults to 100.
47− @objc @IBInspectable public var maximumValue: Double = 100 {
28+
29+ @IBInspectable public var maximumValue: Int = 10 {
4830 didSet {
49− value = min(maximumValue, max(minimumValue, value))
31+ value = 0
5032 }
5133 }
52−
53− /// Step/Increment value as in UIStepper. Defaults to 1.
54− @objc @IBInspectable public var stepValue: Double = 1
55−
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.
57− @objc @IBInspectable public var autorepeat: Bool = true
58−
59− /// If the value is integer, it is shown without floating point.
60− @objc @IBInspectable public var showIntegerIfDoubleIsInteger: Bool = true
61−
62− /// Text on the left button. Be sure that it fits in the button. Defaults to "−".
63− @objc @IBInspectable public var leftButtonText: String = "−" {
34+
35+ @IBInspectable public var leftButtonText: String = "-" {
6436 didSet {
65− leftButton.setTitle(leftButtonText, for: .normal)
37+ leftButton.setTitle(leftButtonText, forState: .Normal)
6638 }
6739 }
68−
69− /// Text on the right button. Be sure that it fits in the button. Defaults to "+".
70− @objc @IBInspectable public var rightButtonText: String = "+" {
40+
41+ @IBInspectable public var rightButtonText: String = "+" {
7142 didSet {
72− rightButton.setTitle(rightButtonText, for: .normal)
43+ rightButton.setTitle(rightButtonText, forState: .Normal)
7344 }
7445 }
75−
76− /// Text color of the buttons. Defaults to white.
77− @objc @IBInspectable public var buttonsTextColor: UIColor = UIColor.white {
46+
47+ @IBInspectable public var buttonsTextColor: UIColor = UIColor.whiteColor() {
7848 didSet {
7949 for button in [leftButton, rightButton] {
80− button.setTitleColor(buttonsTextColor, for: .normal)
50+ button.setTitleColor(buttonsTextColor, forState: .Normal)
8151 }
8252 }
8353 }
84−
85− /// 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) {
54+
55+ @IBInspectable public var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1) {
8756 didSet {
8857 for button in [leftButton, rightButton] {
8958 button.backgroundColor = buttonsBackgroundColor
@@ -91,431 +60,146 @@ import UIKit
9160 backgroundColor = buttonsBackgroundColor
9261 }
9362 }
94−
95− /// 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)! {
63+
64+ public var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)! {
9765 didSet {
9866 for button in [leftButton, rightButton] {
9967 button.titleLabel?.font = buttonsFont
10068 }
10169 }
10270 }
103−
104− /// Text color of the middle label. Defaults to white.
105− @objc @IBInspectable public var labelTextColor: UIColor = UIColor.white {
71+
72+ @IBInspectable public var labelTextColor: UIColor = UIColor.whiteColor() {
10673 didSet {
10774 label.textColor = labelTextColor
10875 }
10976 }
110−
111− /// 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) {
77+
78+ @IBInspectable public var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1) {
11379 didSet {
11480 label.backgroundColor = labelBackgroundColor
11581 }
11682 }
11783
118− /// 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)! {
84+ public var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)! {
12085 didSet {
12186 label.font = labelFont
12287 }
12388 }
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− }
131−
132− /// Corner radius of the stepper's layer. Defaults to 4.0.
133− @objc @IBInspectable public var cornerRadius: CGFloat = 4.0 {
89+
90+ @IBInspectable public var cornerRadius: CGFloat = 4.0 {
13491 didSet {
13592 layer.cornerRadius = cornerRadius
13693 clipsToBounds = true
13794 }
13895 }
13996
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− }
155−
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.
157− @objc @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
97+ @IBInspectable public var labelWidthWeight: CGFloat = 0.5 {
15898 didSet {
15999 labelWidthWeight = min(1, max(0, labelWidthWeight))
160100 setNeedsLayout()
161101 }
162102 }
163−
164− /// 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)
166−
167− /**
168− Width of the sliding animation. When buttons clicked, the middle label does a slide animation towards to the clicked button. Defaults to 5.
169− */
170− let labelSlideLength: CGFloat = 5
171−
172− /// Duration of the sliding animation
173− let labelSlideDuration = TimeInterval(0.1)
174−
175− /// Duration of the animation when the value hits the limit.
176− let limitHitAnimationDuration = TimeInterval(0.1)
177−
178− lazy var leftButton: UIButton = {
179− let button = UIButton()
180− button.setTitle(self.leftButtonText, for: .normal)
181− button.setTitleColor(self.buttonsTextColor, for: .normal)
182− button.backgroundColor = self.buttonsBackgroundColor
183− 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)
188− return button
189− }()
190−
191− lazy var rightButton: UIButton = {
192− let button = UIButton()
193− button.setTitle(self.rightButtonText, for: .normal)
194− button.setTitleColor(self.buttonsTextColor, for: .normal)
195− button.backgroundColor = self.buttonsBackgroundColor
196− 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)
201− return button
202− }()
203−
204− lazy var label: UILabel = {
205− let label = UILabel()
206− label.textAlignment = .center
207− if self.showIntegerIfDoubleIsInteger && floor(self.value) == self.value {
208− label.text = String(stringInterpolationSegment: Int(self.value))
209− } else {
210− label.text = String(stringInterpolationSegment: self.value)
211− }
212− label.textColor = self.labelTextColor
213− label.backgroundColor = self.labelBackgroundColor
214− 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))
219− panRecognizer.maximumNumberOfTouches = 1
220− label.addGestureRecognizer(panRecognizer)
221− return label
222− }()
223−
224− var labelOriginalCenter: CGPoint!
225− var labelMaximumCenterX: CGFloat!
226− var labelMinimumCenterX: CGFloat!
227−
228− enum LabelPanState {
229− case Stable, HitRightEdge, HitLeftEdge
230− }
231− var panState = LabelPanState.Stable
232−
233− enum StepperState {
234− case Stable, ShouldIncrease, ShouldDecrease
235− }
236− var stepperState = StepperState.Stable {
237− didSet {
238− if stepperState != .Stable {
239− updateValue()
240− if autorepeat {
241− scheduleTimer()
242− }
243− }
244− }
245− }
246103
104+ private let labelSlideLength: CGFloat = 5
105+ private let labelSlideDuration: NSTimeInterval = 0.1
247106
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− }
270−
271− /// Timer used for autorepeat option
272− var timer: Timer?
273−
274− /** When UIStepper reaches its top speed, it alters the value with a time interval of ~0.05 sec.
275− The user pressing and holding on the stepper repeatedly:
276− - First 2.5 sec, the stepper changes the value every 0.5 sec.
277− - For the next 1.5 sec, it changes the value every 0.1 sec.
278− - Then, every 0.05 sec.
279− */
280− let timerInterval = TimeInterval(0.05)
281−
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.
283− var timerFireCount = 0
284− var timerFireCountModulo: Int {
285− if timerFireCount > 80 {
286− return 1 // 0.05 sec * 1 = 0.05 sec
287− } else if timerFireCount > 50 {
288− return 2 // 0.05 sec * 2 = 0.1 sec
289− } else {
290− return 10 // 0.05 sec * 10 = 0.5 sec
291− }
292− }
293−
294− @objc required public init?(coder aDecoder: NSCoder) {
107+ private let limitHitAnimationDuration: NSTimeInterval = 0.1
108+ @IBInspectable public var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
109+
110+ private let leftButton = UIButton()
111+ private let rightButton = UIButton()
112+ private let label = UILabel()
113+
114+ required public init(coder aDecoder: NSCoder) {
295115 super.init(coder: aDecoder)
296116 setup()
297117 }
298−
299− @objc public override init(frame: CGRect) {
118+
119+ public override init(frame: CGRect) {
300120 super.init(frame: frame)
301121 setup()
302122 }
303−
304− func setup() {
123+
124+ private func setup() {
125+ leftButton.setTitle(leftButtonText, forState: .Normal)
126+ leftButton.setTitleColor(buttonsTextColor, forState: .Normal)
127+ leftButton.backgroundColor = buttonsBackgroundColor
128+ leftButton.titleLabel?.font = buttonsFont
129+ leftButton.addTarget(self, action: "leftButtonTapped:", forControlEvents: .TouchDown)
305130 addSubview(leftButton)
131+
132+ rightButton.setTitle(rightButtonText, forState: .Normal)
133+ rightButton.setTitleColor(buttonsTextColor, forState: .Normal)
134+ rightButton.backgroundColor = buttonsBackgroundColor
135+ rightButton.titleLabel?.font = buttonsFont
136+ rightButton.addTarget(self, action: "rightButtonTapped:", forControlEvents: .TouchDown)
306137 addSubview(rightButton)
138+
139+ label.textAlignment = .Center
140+ label.text = String(value)
141+ label.textColor = labelTextColor
142+ label.backgroundColor = labelBackgroundColor
143+ label.font = labelFont
307144 addSubview(label)
308−
145+
309146 backgroundColor = buttonsBackgroundColor
310147 layer.cornerRadius = cornerRadius
311148 clipsToBounds = true
312− labelOriginalCenter = label.center
313−
314− NotificationCenter.default.addObserver(self, selector: #selector(GMStepper.reset), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
315149 }
316−
150+
317151 public override func layoutSubviews() {
318152 let buttonWidth = bounds.size.width * ((1 - labelWidthWeight) / 2)
319153 let labelWidth = bounds.size.width * labelWidthWeight
320−
154+
321155 leftButton.frame = CGRect(x: 0, y: 0, width: buttonWidth, height: bounds.size.height)
322156 label.frame = CGRect(x: buttonWidth, y: 0, width: labelWidth, height: bounds.size.height)
323157 rightButton.frame = CGRect(x: labelWidth + buttonWidth, y: 0, width: buttonWidth, height: bounds.size.height)
324−
325− labelMaximumCenterX = label.center.x + labelSlideLength
326− labelMinimumCenterX = label.center.x - labelSlideLength
327− labelOriginalCenter = label.center
328− }
329−
330− func updateValue() {
331− if stepperState == .ShouldIncrease {
332− value += stepValue
333− } else if stepperState == .ShouldDecrease {
334− value -= stepValue
335− }
336158 }
337−
338− deinit {
339− resetTimer()
340− NotificationCenter.default.removeObserver(self)
341− }
342−
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.
344−// lazy var printTimerGaps: () -> () = {
345−// var prevTime: CFAbsoluteTime?
346−//
347−// return { _ in
348−// var now = CFAbsoluteTimeGetCurrent()
349−// if let prevTime = prevTime {
350−// print(now - prevTime)
351−// }
352−// prevTime = now
353−// }
354−// }()
355−}
356−
357−// MARK: Pan Gesture
358−extension GMStepper {
359− @objc func handlePan(gesture: UIPanGestureRecognizer) {
360− 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)
367−
368− let slidingRight = gesture.velocity(in: label).x > 0
369− let slidingLeft = gesture.velocity(in: label).x < 0
370−
371− // Move the label with pan
372− if slidingRight {
373− label.center.x = min(labelMaximumCenterX, label.center.x + translation.x)
374− } else if slidingLeft {
375− label.center.x = max(labelMinimumCenterX, label.center.x + translation.x)
376− }
377−
378− // When the label hits the edges, increase/decrease value and change button backgrounds
379− if label.center.x == labelMaximumCenterX {
380− // If not hit the right edge before, increase the value and start the timer. If already hit the edge, do nothing. Timer will handle it.
381− if panState != .HitRightEdge {
382− stepperState = .ShouldIncrease
383− panState = .HitRightEdge
384− }
385−
386− animateLimitHitIfNeeded()
387− } else if label.center.x == labelMinimumCenterX {
388− if panState != .HitLeftEdge {
389− stepperState = .ShouldDecrease
390− panState = .HitLeftEdge
391− }
392−
393− animateLimitHitIfNeeded()
394− } else {
395− panState = .Stable
396− stepperState = .Stable
397− resetTimer()
398−
399− self.rightButton.backgroundColor = self.buttonsBackgroundColor
400− self.leftButton.backgroundColor = self.buttonsBackgroundColor
401− }
402− case .ended, .cancelled, .failed:
403− reset()
404− default:
405− break
406− }
407− }
408−
409− @objc func reset() {
410− panState = .Stable
411− stepperState = .Stable
412− resetTimer()
413−
414− leftButton.isEnabled = true
415− rightButton.isEnabled = true
416− label.isUserInteractionEnabled = true
417−
418− UIView.animate(withDuration: self.labelSlideDuration, animations: {
419− self.label.center = self.labelOriginalCenter
420− self.rightButton.backgroundColor = self.buttonsBackgroundColor
421− self.leftButton.backgroundColor = self.buttonsBackgroundColor
422− })
423− }
424−}
425−
426−// MARK: Button Events
427−extension GMStepper {
428− @objc func leftButtonTouchDown(button: UIButton) {
429− rightButton.isEnabled = false
430− label.isUserInteractionEnabled = false
431− resetTimer()
432−
159+
160+ @objc private func leftButtonTapped(button: UIButton) {
433161 if value == minimumValue {
434− animateLimitHitIfNeeded()
162+ animateLimitHitForButton(leftButton)
435163 } else {
436− stepperState = .ShouldDecrease
164+ value -= 1
437165 animateSlideLeft()
438166 }
439−
440167 }
441168
442− @objc func rightButtonTouchDown(button: UIButton) {
443− leftButton.isEnabled = false
444− label.isUserInteractionEnabled = false
445− resetTimer()
446−
169+ @objc private func rightButtonTapped(button: UIButton) {
447170 if value == maximumValue {
448− animateLimitHitIfNeeded()
171+ animateLimitHitForButton(rightButton)
449172 } else {
450− stepperState = .ShouldIncrease
173+ value += 1
451174 animateSlideRight()
452175 }
453176 }
454−
455− @objc func buttonTouchUp(button: UIButton) {
456− reset()
457− }
458−}
459−
460−// MARK: Animations
461−extension GMStepper {
462−
463− func animateSlideLeft() {
464− UIView.animate(withDuration: labelSlideDuration) {
177+
178+ private func animateSlideLeft() {
179+ UIView.animateWithDuration(labelSlideDuration, animations: {
465180 self.label.center.x -= self.labelSlideLength
466− }
181+ }, completion: { _ in
182+ UIView.animateWithDuration(self.labelSlideDuration, animations: {
183+ self.label.center.x += self.labelSlideLength
184+ })
185+ })
467186 }
468−
469− func animateSlideRight() {
470− UIView.animate(withDuration: labelSlideDuration) {
187+
188+ private func animateSlideRight() {
189+ UIView.animateWithDuration(labelSlideDuration, animations: {
471190 self.label.center.x += self.labelSlideLength
472− }
473− }
474−
475− func animateToOriginalPosition() {
476− if self.label.center != self.labelOriginalCenter {
477− UIView.animate(withDuration: labelSlideDuration) {
478− self.label.center = self.labelOriginalCenter
479− }
480− }
481− }
482−
483− func animateLimitHitIfNeeded() {
484− if value == minimumValue {
485− animateLimitHitForButton(button: leftButton)
486− } else if value == maximumValue {
487− animateLimitHitForButton(button: rightButton)
488− }
191+ }, completion: { _ in
192+ UIView.animateWithDuration(self.labelSlideDuration, animations: {
193+ self.label.center.x -= self.labelSlideLength
194+ })
195+ })
489196 }
490−
491− func animateLimitHitForButton(button: UIButton){
492− UIView.animate(withDuration: limitHitAnimationDuration) {
197+
198+ private func animateLimitHitForButton(button: UIButton){
199+ UIView.animateWithDuration(limitHitAnimationDuration, animations: {
493200 button.backgroundColor = self.limitHitAnimationColor
494− }
495− }
496−}
497−
498−// MARK: Timer
499−extension GMStepper {
500− @objc func handleTimerFire(timer: Timer) {
501− timerFireCount += 1
502−
503− if timerFireCount % timerFireCountModulo == 0 {
504− updateValue()
505− }
506− }
507−
508− func scheduleTimer() {
509− timer = Timer.scheduledTimer(timeInterval: timerInterval, target: self, selector: #selector(GMStepper.handleTimerFire), userInfo: nil, repeats: true)
510− }
511−
512− func resetTimer() {
513− if let timer = timer {
514− timer.invalidate()
515− self.timer = nil
516− timerFireCount = 0
517− }
201+ }, completion: { _ in
202+ button.backgroundColor = self.buttonsBackgroundColor
203+ })
518204 }
519−
520−
521205}
GMStepperExample/GMStepperExample.xcodeproj/project.pbxproj+106−136
@@ -7,18 +7,17 @@
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 */; };
1210 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19371B4843EB005EFEE5 /* AppDelegate.swift */; };
1311 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C19391B4843EB005EFEE5 /* ViewController.swift */; };
1412 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 319C193B1B4843EB005EFEE5 /* Main.storyboard */; };
1513 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 319C193E1B4843EB005EFEE5 /* Images.xcassets */; };
1614 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 319C19401B4843EB005EFEE5 /* LaunchScreen.xib */; };
15+ 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */; };
1716 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319C195B1B48445E005EFEE5 /* GMStepper.swift */; };
1817/* End PBXBuildFile section */
1918
2019/* Begin PBXContainerItemProxy section */
21− 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */ = {
20+ 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */ = {
2221 isa = PBXContainerItemProxy;
2322 containerPortal = 319C192A1B4843EB005EFEE5 /* Project object */;
2423 proxyType = 1;
@@ -28,9 +27,6 @@
2827/* End PBXContainerItemProxy section */
2928
3029/* 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>"; };
3430 319C19321B4843EB005EFEE5 /* GMStepperExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GMStepperExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
3531 319C19361B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3632 319C19371B4843EB005EFEE5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -38,18 +34,21 @@
3834 319C193C1B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
3935 319C193E1B4843EB005EFEE5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
4036 319C19411B4843EB005EFEE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
37+ 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GMStepperExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
38+ 319C194C1B4843EB005EFEE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
39+ 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GMStepperExampleTests.swift; sourceTree = "<group>"; };
4140 319C195B1B48445E005EFEE5 /* GMStepper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GMStepper.swift; sourceTree = "<group>"; };
4241/* End PBXFileReference section */
4342
4443/* Begin PBXFrameworksBuildPhase section */
45− 3116C0D51DA4DD360015AC69 /* Frameworks */ = {
44+ 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
4645 isa = PBXFrameworksBuildPhase;
4746 buildActionMask = 2147483647;
4847 files = (
4948 );
5049 runOnlyForDeploymentPostprocessing = 0;
5150 };
52− 319C192F1B4843EB005EFEE5 /* Frameworks */ = {
51+ 319C19441B4843EB005EFEE5 /* Frameworks */ = {
5352 isa = PBXFrameworksBuildPhase;
5453 buildActionMask = 2147483647;
5554 files = (
@@ -59,21 +58,12 @@
5958/* End PBXFrameworksBuildPhase section */
6059
6160/* 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− };
7161 319C19291B4843EB005EFEE5 = {
7262 isa = PBXGroup;
7363 children = (
7464 319C195A1B48445E005EFEE5 /* GMStepper */,
7565 319C19341B4843EB005EFEE5 /* GMStepperExample */,
76− 3116C0D91DA4DD360015AC69 /* GMStepperExampleTests */,
66+ 319C194A1B4843EB005EFEE5 /* GMStepperExampleTests */,
7767 319C19331B4843EB005EFEE5 /* Products */,
7868 );
7969 sourceTree = "<group>";
@@ -82,7 +72,7 @@
8272 isa = PBXGroup;
8373 children = (
8474 319C19321B4843EB005EFEE5 /* GMStepperExample.app */,
85− 3116C0D81DA4DD360015AC69 /* GMStepperExampleTests.xctest */,
75+ 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */,
8676 );
8777 name = Products;
8878 sourceTree = "<group>";
@@ -108,6 +98,23 @@
10898 name = "Supporting Files";
10999 sourceTree = "<group>";
110100 };
101+ 319C194A1B4843EB005EFEE5 /* GMStepperExampleTests */ = {
102+ isa = PBXGroup;
103+ children = (
104+ 319C194D1B4843EB005EFEE5 /* GMStepperExampleTests.swift */,
105+ 319C194B1B4843EB005EFEE5 /* Supporting Files */,
106+ );
107+ path = GMStepperExampleTests;
108+ sourceTree = "<group>";
109+ };
110+ 319C194B1B4843EB005EFEE5 /* Supporting Files */ = {
111+ isa = PBXGroup;
112+ children = (
113+ 319C194C1B4843EB005EFEE5 /* Info.plist */,
114+ );
115+ name = "Supporting Files";
116+ sourceTree = "<group>";
117+ };
111118 319C195A1B48445E005EFEE5 /* GMStepper */ = {
112119 isa = PBXGroup;
113120 children = (
@@ -120,24 +127,6 @@
120127/* End PBXGroup section */
121128
122129/* 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− };
141130 319C19311B4843EB005EFEE5 /* GMStepperExample */ = {
142131 isa = PBXNativeTarget;
143132 buildConfigurationList = 319C19511B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExample" */;
@@ -155,27 +144,39 @@
155144 productReference = 319C19321B4843EB005EFEE5 /* GMStepperExample.app */;
156145 productType = "com.apple.product-type.application";
157146 };
147+ 319C19461B4843EB005EFEE5 /* GMStepperExampleTests */ = {
148+ isa = PBXNativeTarget;
149+ buildConfigurationList = 319C19541B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */;
150+ buildPhases = (
151+ 319C19431B4843EB005EFEE5 /* Sources */,
152+ 319C19441B4843EB005EFEE5 /* Frameworks */,
153+ 319C19451B4843EB005EFEE5 /* Resources */,
154+ );
155+ buildRules = (
156+ );
157+ dependencies = (
158+ 319C19491B4843EB005EFEE5 /* PBXTargetDependency */,
159+ );
160+ name = GMStepperExampleTests;
161+ productName = GMStepperExampleTests;
162+ productReference = 319C19471B4843EB005EFEE5 /* GMStepperExampleTests.xctest */;
163+ productType = "com.apple.product-type.bundle.unit-test";
164+ };
158165/* End PBXNativeTarget section */
159166
160167/* Begin PBXProject section */
161168 319C192A1B4843EB005EFEE5 /* Project object */ = {
162169 isa = PBXProject;
163170 attributes = {
164− LastSwiftMigration = 0700;
165− LastSwiftUpdateCheck = 0800;
166− LastUpgradeCheck = 0900;
171+ LastUpgradeCheck = 0640;
167172 ORGANIZATIONNAME = "Gunay Mert Karadogan";
168173 TargetAttributes = {
169− 3116C0D71DA4DD360015AC69 = {
170− CreatedOnToolsVersion = 8.0;
171− LastSwiftMigration = 0900;
172− ProvisioningStyle = Automatic;
173− TestTargetID = 319C19311B4843EB005EFEE5;
174− };
175174 319C19311B4843EB005EFEE5 = {
176175 CreatedOnToolsVersion = 6.4;
177− DevelopmentTeam = 289M6XEDV4;
178− LastSwiftMigration = 0900;
176+ };
177+ 319C19461B4843EB005EFEE5 = {
178+ CreatedOnToolsVersion = 6.4;
179+ TestTargetID = 319C19311B4843EB005EFEE5;
179180 };
180181 };
181182 };
@@ -193,58 +194,57 @@
193194 projectRoot = "";
194195 targets = (
195196 319C19311B4843EB005EFEE5 /* GMStepperExample */,
196− 3116C0D71DA4DD360015AC69 /* GMStepperExampleTests */,
197+ 319C19461B4843EB005EFEE5 /* GMStepperExampleTests */,
197198 );
198199 };
199200/* End PBXProject section */
200201
201202/* Begin PBXResourcesBuildPhase section */
202− 3116C0D61DA4DD360015AC69 /* Resources */ = {
203+ 319C19301B4843EB005EFEE5 /* Resources */ = {
203204 isa = PBXResourcesBuildPhase;
204205 buildActionMask = 2147483647;
205206 files = (
207+ 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
208+ 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
209+ 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
206210 );
207211 runOnlyForDeploymentPostprocessing = 0;
208212 };
209− 319C19301B4843EB005EFEE5 /* Resources */ = {
213+ 319C19451B4843EB005EFEE5 /* Resources */ = {
210214 isa = PBXResourcesBuildPhase;
211215 buildActionMask = 2147483647;
212216 files = (
213− 319C193D1B4843EB005EFEE5 /* Main.storyboard in Resources */,
214− 319C19421B4843EB005EFEE5 /* LaunchScreen.xib in Resources */,
215− 319C193F1B4843EB005EFEE5 /* Images.xcassets in Resources */,
216217 );
217218 runOnlyForDeploymentPostprocessing = 0;
218219 };
219220/* End PBXResourcesBuildPhase section */
220221
221222/* Begin PBXSourcesBuildPhase section */
222− 3116C0D41DA4DD360015AC69 /* Sources */ = {
223+ 319C192E1B4843EB005EFEE5 /* Sources */ = {
223224 isa = PBXSourcesBuildPhase;
224225 buildActionMask = 2147483647;
225226 files = (
226− 3116C0DB1DA4DD360015AC69 /* GMStepperExampleTests.swift in Sources */,
227− 3198AC771DA4DEE500311FB3 /* GMStepper.swift in Sources */,
227+ 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
228+ 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
229+ 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
228230 );
229231 runOnlyForDeploymentPostprocessing = 0;
230232 };
231− 319C192E1B4843EB005EFEE5 /* Sources */ = {
233+ 319C19431B4843EB005EFEE5 /* Sources */ = {
232234 isa = PBXSourcesBuildPhase;
233235 buildActionMask = 2147483647;
234236 files = (
235− 319C193A1B4843EB005EFEE5 /* ViewController.swift in Sources */,
236− 319C195C1B48445E005EFEE5 /* GMStepper.swift in Sources */,
237− 319C19381B4843EB005EFEE5 /* AppDelegate.swift in Sources */,
237+ 319C194E1B4843EB005EFEE5 /* GMStepperExampleTests.swift in Sources */,
238238 );
239239 runOnlyForDeploymentPostprocessing = 0;
240240 };
241241/* End PBXSourcesBuildPhase section */
242242
243243/* Begin PBXTargetDependency section */
244− 3116C0DE1DA4DD360015AC69 /* PBXTargetDependency */ = {
244+ 319C19491B4843EB005EFEE5 /* PBXTargetDependency */ = {
245245 isa = PBXTargetDependency;
246246 target = 319C19311B4843EB005EFEE5 /* GMStepperExample */;
247− targetProxy = 3116C0DD1DA4DD360015AC69 /* PBXContainerItemProxy */;
247+ targetProxy = 319C19481B4843EB005EFEE5 /* PBXContainerItemProxy */;
248248 };
249249/* End PBXTargetDependency section */
250250
@@ -268,44 +268,6 @@
268268/* End PBXVariantGroup section */
269269
270270/* 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− };
309271 319C194F1B4843EB005EFEE5 /* Debug */ = {
310272 isa = XCBuildConfiguration;
311273 buildSettings = {
@@ -314,28 +276,19 @@
314276 CLANG_CXX_LIBRARY = "libc++";
315277 CLANG_ENABLE_MODULES = YES;
316278 CLANG_ENABLE_OBJC_ARC = YES;
317− CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
318279 CLANG_WARN_BOOL_CONVERSION = YES;
319− CLANG_WARN_COMMA = YES;
320280 CLANG_WARN_CONSTANT_CONVERSION = YES;
321281 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
322282 CLANG_WARN_EMPTY_BODY = YES;
323283 CLANG_WARN_ENUM_CONVERSION = YES;
324− CLANG_WARN_INFINITE_RECURSION = YES;
325284 CLANG_WARN_INT_CONVERSION = YES;
326− CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
327− CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
328285 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;
332286 CLANG_WARN_UNREACHABLE_CODE = YES;
333287 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
334288 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
335289 COPY_PHASE_STRIP = NO;
336290 DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
337291 ENABLE_STRICT_OBJC_MSGSEND = YES;
338− ENABLE_TESTABILITY = YES;
339292 GCC_C_LANGUAGE_STANDARD = gnu99;
340293 GCC_DYNAMIC_NO_PIC = NO;
341294 GCC_NO_COMMON_BLOCKS = YES;
@@ -367,21 +320,13 @@
367320 CLANG_CXX_LIBRARY = "libc++";
368321 CLANG_ENABLE_MODULES = YES;
369322 CLANG_ENABLE_OBJC_ARC = YES;
370− CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
371323 CLANG_WARN_BOOL_CONVERSION = YES;
372− CLANG_WARN_COMMA = YES;
373324 CLANG_WARN_CONSTANT_CONVERSION = YES;
374325 CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
375326 CLANG_WARN_EMPTY_BODY = YES;
376327 CLANG_WARN_ENUM_CONVERSION = YES;
377− CLANG_WARN_INFINITE_RECURSION = YES;
378328 CLANG_WARN_INT_CONVERSION = YES;
379− CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
380− CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
381329 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;
385330 CLANG_WARN_UNREACHABLE_CODE = YES;
386331 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
387332 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -400,7 +345,6 @@
400345 IPHONEOS_DEPLOYMENT_TARGET = 8.4;
401346 MTL_ENABLE_DEBUG_INFO = NO;
402347 SDKROOT = iphoneos;
403− SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
404348 VALIDATE_PRODUCT = YES;
405349 };
406350 name = Release;
@@ -409,13 +353,9 @@
409353 isa = XCBuildConfiguration;
410354 buildSettings = {
411355 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
412− DEVELOPMENT_TEAM = 289M6XEDV4;
413356 INFOPLIST_FILE = GMStepperExample/Info.plist;
414357 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
415− PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
416358 PRODUCT_NAME = "$(TARGET_NAME)";
417− SWIFT_SWIFT3_OBJC_INFERENCE = Default;
418− SWIFT_VERSION = 4.0;
419359 };
420360 name = Debug;
421361 };
@@ -423,28 +363,49 @@
423363 isa = XCBuildConfiguration;
424364 buildSettings = {
425365 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
426− DEVELOPMENT_TEAM = 289M6XEDV4;
427366 INFOPLIST_FILE = GMStepperExample/Info.plist;
428367 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
429− PRODUCT_BUNDLE_IDENTIFIER = "com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)";
430368 PRODUCT_NAME = "$(TARGET_NAME)";
431− SWIFT_SWIFT3_OBJC_INFERENCE = Default;
432− SWIFT_VERSION = 4.0;
369+ };
370+ name = Release;
371+ };
372+ 319C19551B4843EB005EFEE5 /* Debug */ = {
373+ isa = XCBuildConfiguration;
374+ buildSettings = {
375+ BUNDLE_LOADER = "$(TEST_HOST)";
376+ FRAMEWORK_SEARCH_PATHS = (
377+ "$(SDKROOT)/Developer/Library/Frameworks",
378+ "$(inherited)",
379+ );
380+ GCC_PREPROCESSOR_DEFINITIONS = (
381+ "DEBUG=1",
382+ "$(inherited)",
383+ );
384+ INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
385+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
386+ PRODUCT_NAME = "$(TARGET_NAME)";
387+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
388+ };
389+ name = Debug;
390+ };
391+ 319C19561B4843EB005EFEE5 /* Release */ = {
392+ isa = XCBuildConfiguration;
393+ buildSettings = {
394+ BUNDLE_LOADER = "$(TEST_HOST)";
395+ FRAMEWORK_SEARCH_PATHS = (
396+ "$(SDKROOT)/Developer/Library/Frameworks",
397+ "$(inherited)",
398+ );
399+ INFOPLIST_FILE = GMStepperExampleTests/Info.plist;
400+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
401+ PRODUCT_NAME = "$(TARGET_NAME)";
402+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GMStepperExample.app/GMStepperExample";
433403 };
434404 name = Release;
435405 };
436406/* End XCBuildConfiguration section */
437407
438408/* 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− };
448409 319C192D1B4843EB005EFEE5 /* Build configuration list for PBXProject "GMStepperExample" */ = {
449410 isa = XCConfigurationList;
450411 buildConfigurations = (
@@ -463,6 +424,15 @@
463424 defaultConfigurationIsVisible = 0;
464425 defaultConfigurationName = Release;
465426 };
427+ 319C19541B4843EB005EFEE5 /* Build configuration list for PBXNativeTarget "GMStepperExampleTests" */ = {
428+ isa = XCConfigurationList;
429+ buildConfigurations = (
430+ 319C19551B4843EB005EFEE5 /* Debug */,
431+ 319C19561B4843EB005EFEE5 /* Release */,
432+ );
433+ defaultConfigurationIsVisible = 0;
434+ defaultConfigurationName = Release;
435+ };
466436/* End XCConfigurationList section */
467437 };
468438 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/LaunchScreen.xib+2−6
@@ -1,8 +1,7 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2−<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15A279b" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
2+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6214" systemVersion="14A314h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
33 <dependencies>
4− <deployment identifier="iOS"/>
5− <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
4+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6207"/>
65 <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
76 </dependencies>
87 <objects>
@@ -14,20 +13,17 @@
1413 <subviews>
1514 <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2015 Gunay Mert Karadogan. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
1615 <rect key="frame" x="20" y="439" width="441" height="21"/>
17− <animations/>
1816 <fontDescription key="fontDescription" type="system" pointSize="17"/>
1917 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
2018 <nil key="highlightedColor"/>
2119 </label>
2220 <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GMStepperExample" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
2321 <rect key="frame" x="20" y="140" width="441" height="43"/>
24− <animations/>
2522 <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
2623 <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
2724 <nil key="highlightedColor"/>
2825 </label>
2926 </subviews>
30− <animations/>
3127 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
3228 <constraints>
3329 <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
GMStepperExample/GMStepperExample/Base.lproj/Main.storyboard+39−79
@@ -1,10 +1,8 @@
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="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
33 <dependencies>
4− <deployment identifier="iOS"/>
5− <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
4+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
65 <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
7− <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
86 </dependencies>
97 <scenes>
108 <!--View Controller-->
@@ -16,92 +14,96 @@
1614 <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
1715 </layoutGuides>
1816 <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
19− <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
17+ <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
2018 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
2119 <subviews>
2220 <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"/>
21+ <rect key="frame" x="24" y="28" width="552" height="44"/>
22+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
2423 <constraints>
2524 <constraint firstAttribute="height" constant="44" id="6mC-hP-wFD"/>
2625 </constraints>
2726 <userDefinedRuntimeAttributes>
28− <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
29− <real key="value" value="25"/>
30− </userDefinedRuntimeAttribute>
31− <userDefinedRuntimeAttribute type="number" keyPath="stepValue">
32− <real key="value" value="5"/>
27+ <userDefinedRuntimeAttribute type="number" keyPath="minimumValue">
28+ <integer key="value" value="1"/>
3329 </userDefinedRuntimeAttribute>
3430 </userDefinedRuntimeAttributes>
3531 </view>
3632 <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"/>
33+ <rect key="frame" x="140" y="116" width="320" height="66"/>
34+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
3835 <constraints>
3936 <constraint firstAttribute="height" constant="66" id="iQi-6P-vt9"/>
4037 <constraint firstAttribute="width" constant="320" id="ji4-Pf-1fZ"/>
4138 </constraints>
4239 <userDefinedRuntimeAttributes>
40+ <userDefinedRuntimeAttribute type="number" keyPath="minimumValue">
41+ <integer key="value" value="7"/>
42+ </userDefinedRuntimeAttribute>
43+ <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
44+ <integer key="value" value="10"/>
45+ </userDefinedRuntimeAttribute>
4346 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
44− <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
47+ <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="calibratedRGB"/>
4548 </userDefinedRuntimeAttribute>
4649 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
47− <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
50+ <color key="value" red="1" green="0.3591497541" blue="0.36842127060000002" alpha="1" colorSpace="calibratedRGB"/>
4851 </userDefinedRuntimeAttribute>
4952 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
50− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
53+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
5154 </userDefinedRuntimeAttribute>
5255 <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− </userDefinedRuntimeAttribute>
55− <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− </userDefinedRuntimeAttribute>
58− <userDefinedRuntimeAttribute type="number" keyPath="stepValue">
59− <real key="value" value="0.5"/>
56+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
6057 </userDefinedRuntimeAttribute>
6158 </userDefinedRuntimeAttributes>
6259 </view>
6360 <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"/>
61+ <rect key="frame" x="200" y="226" width="200" height="66"/>
62+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
6563 <constraints>
6664 <constraint firstAttribute="width" constant="200" id="dVu-w0-mf0"/>
6765 <constraint firstAttribute="height" constant="66" id="ie8-vl-NAV"/>
6866 </constraints>
6967 <userDefinedRuntimeAttributes>
7068 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
71− <color key="value" red="0.1819814891" green="0.69426733259999995" blue="0.53024792669999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
69+ <color key="value" red="0.1819814891" green="0.69426733259999995" blue="0.53024792669999998" alpha="1" colorSpace="calibratedRGB"/>
7270 </userDefinedRuntimeAttribute>
7371 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
74− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
72+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
7573 </userDefinedRuntimeAttribute>
7674 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
77− <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
75+ <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="calibratedRGB"/>
7876 </userDefinedRuntimeAttribute>
7977 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
80− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
78+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
8179 </userDefinedRuntimeAttribute>
82− <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
83− <color key="value" red="0.6588235294" green="0.85882352939999995" blue="0.6588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
80+ <userDefinedRuntimeAttribute type="number" keyPath="minimumValue">
81+ <integer key="value" value="9"/>
82+ </userDefinedRuntimeAttribute>
83+ <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
84+ <integer key="value" value="13"/>
8485 </userDefinedRuntimeAttribute>
8586 </userDefinedRuntimeAttributes>
8687 </view>
8788 <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"/>
89+ <rect key="frame" x="24" y="336" width="552" height="44"/>
90+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
8991 <constraints>
9092 <constraint firstAttribute="height" constant="44" id="aF3-T7-dIP"/>
9193 <constraint firstAttribute="width" constant="200" id="vhP-7K-vOu"/>
9294 </constraints>
9395 <userDefinedRuntimeAttributes>
9496 <userDefinedRuntimeAttribute type="color" keyPath="buttonsBackgroundColor">
95− <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
97+ <color key="value" red="0.90823972230000005" green="0.92638683320000004" blue="0.93171715740000005" alpha="1" colorSpace="calibratedRGB"/>
9698 </userDefinedRuntimeAttribute>
9799 <userDefinedRuntimeAttribute type="color" keyPath="labelTextColor">
98− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
100+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
99101 </userDefinedRuntimeAttribute>
100102 <userDefinedRuntimeAttribute type="color" keyPath="labelBackgroundColor">
101− <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
103+ <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
102104 </userDefinedRuntimeAttribute>
103105 <userDefinedRuntimeAttribute type="color" keyPath="buttonsTextColor">
104− <color key="value" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
106+ <color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
105107 </userDefinedRuntimeAttribute>
106108 <userDefinedRuntimeAttribute type="number" keyPath="labelWidthWeight">
107109 <real key="value" value="0.69999999999999996"/>
@@ -109,13 +111,10 @@
109111 <userDefinedRuntimeAttribute type="string" keyPath="leftButtonText" value="😞"/>
110112 <userDefinedRuntimeAttribute type="string" keyPath="rightButtonText" value="☺️"/>
111113 <userDefinedRuntimeAttribute type="number" keyPath="minimumValue">
112− <integer key="value" value="0"/>
114+ <integer key="value" value="5"/>
113115 </userDefinedRuntimeAttribute>
114116 <userDefinedRuntimeAttribute type="color" keyPath="limitHitAnimationColor">
115− <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
116− </userDefinedRuntimeAttribute>
117− <userDefinedRuntimeAttribute type="number" keyPath="maximumValue">
118− <integer key="value" value="100"/>
117+ <color key="value" red="0.98624199629999998" green="0.77968657019999998" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
119118 </userDefinedRuntimeAttribute>
120119 </userDefinedRuntimeAttributes>
121120 <variation key="default">
@@ -124,44 +123,8 @@
124123 </mask>
125124 </variation>
126125 </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>
163126 </subviews>
164− <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
127+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
165128 <constraints>
166129 <constraint firstItem="R9n-I0-fq7" firstAttribute="centerX" secondItem="U8X-8Z-7Mo" secondAttribute="centerX" id="3cD-WW-Qg4"/>
167130 <constraint firstItem="if7-U5-bAM" firstAttribute="top" secondItem="AU6-4C-B2F" secondAttribute="bottom" constant="44" id="662-W9-CUn"/>
@@ -171,9 +134,7 @@
171134 <constraint firstItem="if7-U5-bAM" firstAttribute="centerX" secondItem="R9n-I0-fq7" secondAttribute="centerX" id="K7g-rC-ehJ"/>
172135 <constraint firstItem="U8X-8Z-7Mo" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" constant="8" id="S1b-pD-UXA"/>
173136 <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"/>
175137 <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"/>
177138 <constraint firstAttribute="trailingMargin" secondItem="U8X-8Z-7Mo" secondAttribute="trailing" constant="8" id="ppd-nb-fL8"/>
178139 <constraint firstItem="AU6-4C-B2F" firstAttribute="top" secondItem="jyV-Pf-zRb" secondAttribute="bottom" constant="8" symbolic="YES" id="zDK-gF-kms"/>
179140 </constraints>
@@ -184,7 +145,6 @@
184145 </viewController>
185146 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
186147 </objects>
187− <point key="canvasLocation" x="274" y="363"/>
188148 </scene>
189149 </scenes>
190150</document>
GMStepperExample/GMStepperExample/Info.plist+1−1
@@ -7,7 +7,7 @@
77 <key>CFBundleExecutable</key>
88 <string>$(EXECUTABLE_NAME)</string>
99 <key>CFBundleIdentifier</key>
10− <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
10+ <string>com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)</string>
1111 <key>CFBundleInfoDictionaryVersion</key>
1212 <string>6.0</string>
1313 <key>CFBundleName</key>
GMStepperExample/GMStepperExample/ViewController.swift+5−4
@@ -13,10 +13,11 @@ 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 }
18−
19− @objc func stepperValueChanged(stepper: GMStepper) {
20− print(stepper.value, terminator: "")
18+
19+ func stepperValueChanged(stepper: GMStepper) {
20+ println(stepper.value)
2121 }
2222}
23+
GMStepperExample/GMStepperExampleTests/GMStepperExampleTests.swift+17−23
@@ -6,37 +6,31 @@
66// Copyright (c) 2015 Gunay Mert Karadogan. All rights reserved.
77//
88
9−import XCTest
109import UIKit
10+import XCTest
1111
1212class GMStepperExampleTests: XCTestCase {
13− var stepper: GMStepper!
14−
13+
1514 override func setUp() {
1615 super.setUp()
17− stepper = GMStepper()
16+ // Put setup code here. This method is called before the invocation of each test method in the class.
1817 }
19−
20− func testDefaults() {
21− XCTAssert(stepper.minimumValue == 0, "minimumValue defaults 0")
22− XCTAssert(stepper.maximumValue == 100, "maximumValue defaults to 100")
23− XCTAssert(stepper.value == 0, "value defaults to 0")
24− }
25−
26− func testMinimum_limitsValue() {
27− stepper.minimumValue = 1
28− stepper.value = 0
29−
30− XCTAssert(stepper.value == stepper.minimumValue, "Pass")
18+
19+ override func tearDown() {
20+ // Put teardown code here. This method is called after the invocation of each test method in the class.
21+ super.tearDown()
3122 }
32−
33− func testMaximum_limitsValue() {
34− let stepper = GMStepper()
35− stepper.maximumValue = 1
36− stepper.value = 2
37−
38− XCTAssert(stepper.value == stepper.maximumValue, "Pass")
23+
24+ func testExample() {
25+ // This is an example of a functional test case.
26+ XCTAssert(true, "Pass")
3927 }
4028
29+ func testPerformanceExample() {
30+ // This is an example of a performance test case.
31+ self.measureBlock() {
32+ // Put the code you want to measure the time of here.
33+ }
34+ }
4135
4236}
GMStepperExample/GMStepperExampleTests/Info.plist+3−1
@@ -7,7 +7,7 @@
77 <key>CFBundleExecutable</key>
88 <string>$(EXECUTABLE_NAME)</string>
99 <key>CFBundleIdentifier</key>
10− <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
10+ <string>com.gunaymert.$(PRODUCT_NAME:rfc1034identifier)</string>
1111 <key>CFBundleInfoDictionaryVersion</key>
1212 <string>6.0</string>
1313 <key>CFBundleName</key>
@@ -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+2−96
@@ -3,99 +3,5 @@
33[![License](https://img.shields.io/cocoapods/l/GMStepper.svg?style=flat)](http://cocoapods.org/pods/GMStepper)
44[![Platform](https://img.shields.io/cocoapods/p/GMStepper.svg?style=flat)](http://cocoapods.org/pods/GMStepper)
55
6−A 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−
8−
9−## Screenshot
10−
11−![Screenshot_1.gif](https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.gif)
12−
13−
14−## Usage
15−
16−GMStepper is available through [CocoaPods](http://cocoapods.org). To install
17−it, simply add the following lines to your Podfile:
18−
19−```ruby
20−use_frameworks!
21−pod "GMStepper"
22−```
23−
24−## Setup
25−
26−If 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−
28−## Properties
29−```swift
30−/// Current value of the stepper. Defaults to 0.
31−var value: Double = 0
32−
33−/// Minimum value. Must be less than maximumValue. Defaults to 0.
34−var minimumValue: Double = 0
35−
36−/// Maximum value. Must be more than minimumValue. Defaults to 100.
37−var maximumValue: Double = 100
38−
39−/// Step/Increment value as in UIStepper. Defaults to 1.
40−var stepValue: Double = 1
41−
42−/// The same as UIStepper's autorepeat. If true, holding on the buttons or keeping the pan gesture alters the value repeatedly. Defaults to true.
43−var autorepeat: Bool = true
44−
45−/// If the value is integer, it is shown without floating point.
46−var showIntegerIfDoubleIsInteger: Bool = true
47−
48−/// Text on the left button. Be sure that it fits in the button. Defaults to "-".
49−var leftButtonText: String = "-"
50−
51−/// Text on the right button. Be sure that it fits in the button. Defaults to "+".
52−var rightButtonText: String = "+"
53−
54−/// Text color of the buttons. Defaults to white
55−var buttonsTextColor: UIColor = UIColor.whiteColor()
56−
57−/// Background color of the buttons. Defaults to dark blue.
58−var buttonsBackgroundColor: UIColor = UIColor(red:0.21, green:0.5, blue:0.74, alpha:1)
59−
60−/// Font of the buttons. Defaults to AvenirNext-Bold, 20.0 points in size.
61−var buttonsFont = UIFont(name: "AvenirNext-Bold", size: 20.0)
62−
63−/// Text color of the middle label. Defaults to white.
64−var labelTextColor: UIColor = UIColor.whiteColor()
65−
66−/// Text color of the middle label. Defaults to lighter blue.
67−var labelBackgroundColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
68−
69−/// Font of the middle label. Defaults to AvenirNext-Bold, 25.0 points in size.
70−var labelFont = UIFont(name: "AvenirNext-Bold", size: 25.0)
71−
72−/// Corner radius of the middle label's layer. Defaults to 0.0.
73−var labelCornerRadius: CGFloat = 0.0
74−
75−/// Corner radius of the stepper's layer. Defaults to 4.0.
76−var cornerRadius: CGFloat = 4.0
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−
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.
85−var labelWidthWeight: CGFloat = 0.5
86−
87−/// Color of the flashing animation on the buttons in case the value hit the limit.
88−var limitHitAnimationColor: UIColor = UIColor(red:0.26, green:0.6, blue:0.87, alpha:1)
89−```
90−
91−
92−## Authors
93−
94−* [Brent Whitman](https://github.com/bwhtmn) - Maintainer
95−* [Günay Mert Karadoğan](https://github.com/gmertk) - Creator
96−
97−## License
98−
99−GMStepper is available under the MIT license. See the LICENSE file for more info.
100−
101−
6+A stepper with a sliding label in the middle.
7+![Screenshot 1](https://raw.githubusercontent.com/gmertk/GMStepper/master/Screenshots/screenshot_1.png)
Screenshots/screenshot_1.gifdeleted

Binary file not shown.

Screenshots/screenshot_1.pngnew file

Binary file not shown.