From 78a5c7681afe76e747736552ed69f1bff8225e4f Mon Sep 17 00:00:00 2001 From: Xavier Schott Date: Sat, 4 Feb 2017 20:33:02 -0800 Subject: [PATCH 1/5] Removed Objective-C --- TGPControls.podspec | 23 +- TGPControls.xcodeproj/project.pbxproj | 8 - TGPControls/TGPCamelLabels.h | 48 -- TGPControls/TGPCamelLabels.m | 45 -- TGPControls/TGPCamelLabels7.h | 53 -- TGPControls/TGPCamelLabels7.m | 312 -------- TGPControls/TGPControlsTicksProtocol.h | 38 - TGPControls/TGPDiscreteSlider.h | 60 -- TGPControls/TGPDiscreteSlider.m | 64 -- TGPControls/TGPDiscreteSlider7.h | 79 -- TGPControls/TGPDiscreteSlider7.m | 726 ------------------ TGPControlsDemo/Podfile | 15 +- .../TGPControlsDemo.xcodeproj/project.pbxproj | 387 ++++------ .../TGPControlsDemo/AppDelegate.swift | 28 +- .../AppIcon.appiconset/Contents.json | 25 + .../thumb.imageset/Contents.json | 0 .../thumb.imageset/wthumb.png | Bin .../tick.imageset/Contents.json | 0 .../tick.imageset/wtick.png | Bin .../track.imageset/Contents.json | 0 .../track.imageset/wtrack.png | Bin .../Base.lproj/LaunchScreen.storyboard | 27 + .../Base.lproj/LaunchScreen.xib | 41 - .../Base.lproj/Main.storyboard | 75 +- TGPControlsDemo/TGPControlsDemo/Info.plist | 2 - .../TGPControlsDemo/ViewController.swift | 79 +- .../TGPControlsDemoTests/Info.plist | 24 - .../TGPControlsDemoTests.swift | 58 -- 28 files changed, 276 insertions(+), 1941 deletions(-) delete mode 100644 TGPControls/TGPCamelLabels.h delete mode 100644 TGPControls/TGPCamelLabels.m delete mode 100644 TGPControls/TGPCamelLabels7.h delete mode 100644 TGPControls/TGPCamelLabels7.m delete mode 100644 TGPControls/TGPControlsTicksProtocol.h delete mode 100644 TGPControls/TGPDiscreteSlider.h delete mode 100644 TGPControls/TGPDiscreteSlider.m delete mode 100644 TGPControls/TGPDiscreteSlider7.h delete mode 100644 TGPControls/TGPDiscreteSlider7.m rename TGPControlsDemo/TGPControlsDemo/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/Contents.json (71%) rename TGPControlsDemo/TGPControlsDemo/{Images.xcassets => Assets.xcassets}/thumb.imageset/Contents.json (100%) rename TGPControlsDemo/TGPControlsDemo/{Images.xcassets => Assets.xcassets}/thumb.imageset/wthumb.png (100%) rename TGPControlsDemo/TGPControlsDemo/{Images.xcassets => Assets.xcassets}/tick.imageset/Contents.json (100%) rename TGPControlsDemo/TGPControlsDemo/{Images.xcassets => Assets.xcassets}/tick.imageset/wtick.png (100%) rename TGPControlsDemo/TGPControlsDemo/{Images.xcassets => Assets.xcassets}/track.imageset/Contents.json (100%) rename TGPControlsDemo/TGPControlsDemo/{Images.xcassets => Assets.xcassets}/track.imageset/wtrack.png (100%) create mode 100644 TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.storyboard delete mode 100644 TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.xib delete mode 100644 TGPControlsDemo/TGPControlsDemoTests/Info.plist delete mode 100644 TGPControlsDemo/TGPControlsDemoTests/TGPControlsDemoTests.swift diff --git a/TGPControls.podspec b/TGPControls.podspec index bba6571..8bbdb0e 100644 --- a/TGPControls.podspec +++ b/TGPControls.podspec @@ -16,7 +16,7 @@ Pod::Spec.new do |s| # s.name = "TGPControls" - s.version = "2.0.0" + s.version = "3.0.0" s.summary = "Custom Awesome iOS Controls: Animated discrete slider, animated labels" s.description = <<-DESC @@ -26,7 +26,7 @@ Pod::Spec.new do |s| DESC - s.homepage = "https://github.com/arquebuse/TGPControls" + s.homepage = "https://github.com/SwiftArchitect/TGPControls" s.screenshots = "https://cloud.githubusercontent.com/assets/4073988/5912371/144aaf24-a588-11e4-9a22-42832eb2c235.gif", "https://cloud.githubusercontent.com/assets/4073988/5912454/15774398-a589-11e4-8f08-18c9c7b59871.gif", "https://cloud.githubusercontent.com/assets/4073988/6628373/183c7452-c8c2-11e4-9a63-107805bc0cc4.gif", "https://cloud.githubusercontent.com/assets/4073988/5912297/c3f21bb2-a586-11e4-8eb1-a1f930ccbdd5.gif" @@ -37,7 +37,6 @@ Pod::Spec.new do |s| # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. # - # s.license = "MIT (example)" s.license = { :type => "MIT", :file => "TGPControls_License.txt" } @@ -52,7 +51,7 @@ Pod::Spec.new do |s| # s.author = { "Xavier Schott" => "http://swiftarchitect.com/swiftarchitect/" } - s.social_media_url = "https://twitter.com/swiftarchitect" + #s.social_media_url = "https://twitter.com/swiftarchitect" # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # @@ -61,7 +60,7 @@ Pod::Spec.new do |s| # the deployment target. You can optionally include the target after the platform. # - s.platform = :ios, "7.0" + s.platform = :ios, "9.3" # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # @@ -70,7 +69,7 @@ Pod::Spec.new do |s| # Supports git, hg, bzr, svn and HTTP. # - s.source = { :git => "https://github.com/SwiftArchitect/TGPControls.git", :tag => "v2.0.0" } + s.source = { :git => "https://github.com/SwiftArchitect/TGPControls.git", :tag => "v3.0.0" } # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # @@ -81,18 +80,8 @@ Pod::Spec.new do |s| # Not including the public_header_files will make all headers public. # - s.source_files = "TGPControls", "TGPControls/**/*.{h,m}" + s.source_files = "TGPControls", "TGPControls/**/*.swift" s.exclude_files = "TGPControlsDemo7/*", "TGPControlsDemo/*" - s.public_header_files = "TGPControls/**/*.{h}" - - - # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # If your library depends on compiler flags you can set them in the xcconfig hash - # where they will only apply to your library. If you depend on other Podspecs - # you can include multiple dependencies to ensure it works. - - s.requires_arc = true end diff --git a/TGPControls.xcodeproj/project.pbxproj b/TGPControls.xcodeproj/project.pbxproj index d44496e..72835c9 100644 --- a/TGPControls.xcodeproj/project.pbxproj +++ b/TGPControls.xcodeproj/project.pbxproj @@ -7,10 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - DC0468E31A75962E0084DE3E /* TGPCamelLabels7.m in Sources */ = {isa = PBXBuildFile; fileRef = DC0468E01A75962E0084DE3E /* TGPCamelLabels7.m */; }; - DC0468E41A75962E0084DE3E /* TGPDiscreteSlider7.m in Sources */ = {isa = PBXBuildFile; fileRef = DC0468E21A75962E0084DE3E /* TGPDiscreteSlider7.m */; }; - DC0468E71A7596690084DE3E /* TGPCamelLabels.m in Sources */ = {isa = PBXBuildFile; fileRef = DC0468E61A7596690084DE3E /* TGPCamelLabels.m */; }; - DC0468EA1A7596930084DE3E /* TGPDiscreteSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = DC0468E91A7596930084DE3E /* TGPDiscreteSlider.m */; }; DC101D661A75749600ECCF80 /* libTGPControls.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DC101D5A1A75749600ECCF80 /* libTGPControls.a */; }; /* End PBXBuildFile section */ @@ -212,10 +208,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DC0468E31A75962E0084DE3E /* TGPCamelLabels7.m in Sources */, - DC0468E71A7596690084DE3E /* TGPCamelLabels.m in Sources */, - DC0468E41A75962E0084DE3E /* TGPDiscreteSlider7.m in Sources */, - DC0468EA1A7596930084DE3E /* TGPDiscreteSlider.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TGPControls/TGPCamelLabels.h b/TGPControls/TGPCamelLabels.h deleted file mode 100644 index 2225f85..0000000 --- a/TGPControls/TGPCamelLabels.h +++ /dev/null @@ -1,48 +0,0 @@ -// @file: TGPCamelLabels.h -// @project: TGPControls -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "TGPCamelLabels7.h" - -IB_DESIGNABLE -@interface TGPCamelLabels : TGPCamelLabels7 - -@property (nonatomic) IBInspectable NSUInteger tickCount; // Only used if [labels count] < 1 -@property (nonatomic) IBInspectable CGFloat ticksDistance; -@property (nonatomic) IBInspectable NSUInteger value; - -@property (nonatomic) IBInspectable NSString * upFontName; -@property (nonatomic) IBInspectable CGFloat upFontSize; -@property (nonatomic) IBInspectable UIColor * upFontColor; - -@property (nonatomic) IBInspectable NSString * downFontName; -@property (nonatomic) IBInspectable CGFloat downFontSize; -@property (nonatomic) IBInspectable UIColor * downFontColor; - -@end diff --git a/TGPControls/TGPCamelLabels.m b/TGPControls/TGPCamelLabels.m deleted file mode 100644 index 4aabf84..0000000 --- a/TGPControls/TGPCamelLabels.m +++ /dev/null @@ -1,45 +0,0 @@ -// @file: TGPCamelLabels.m -// @project: TGPControls -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "TGPCamelLabels.h" - -@implementation TGPCamelLabels - -@dynamic tickCount; -@dynamic ticksDistance; -@dynamic value; -@dynamic upFontName; -@dynamic upFontSize; -@dynamic upFontColor; -@dynamic downFontName; -@dynamic downFontSize; -@dynamic downFontColor; - -@end diff --git a/TGPControls/TGPCamelLabels7.h b/TGPControls/TGPCamelLabels7.h deleted file mode 100644 index 82e64c5..0000000 --- a/TGPControls/TGPCamelLabels7.h +++ /dev/null @@ -1,53 +0,0 @@ -// @file: TGPCamelLabels7.h -// @project: TGPControls -// -// @history: Created July 4th, 2014 (Independence Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import -#import "TGPControlsTicksProtocol.h" - -@interface TGPCamelLabels7 : UIControl - -@property (nonatomic, assign) NSUInteger tickCount; // Only used if [labels count] < 1 -@property (nonatomic, assign) CGFloat ticksDistance; -@property (nonatomic, assign) NSUInteger value; - -@property (nonatomic, strong) NSString * upFontName; -@property (nonatomic, assign) CGFloat upFontSize; -@property (nonatomic, strong) UIColor * upFontColor; - -@property (nonatomic, strong) NSString * downFontName; -@property (nonatomic, assign) CGFloat downFontSize; -@property (nonatomic, strong) UIColor * downFontColor; - -@property (nonatomic, strong) NSArray * names; // Will dictate the number of ticks -@property (nonatomic, assign) NSTimeInterval animationDuration; - -@property (nonatomic, assign) BOOL animate; // Make the labels animate when selected - -@end diff --git a/TGPControls/TGPCamelLabels7.m b/TGPControls/TGPCamelLabels7.m deleted file mode 100644 index 90867da..0000000 --- a/TGPControls/TGPCamelLabels7.m +++ /dev/null @@ -1,312 +0,0 @@ -// @file: TGPCamelLabels7.m -// @project: TGPControls -// -// @history: Created July 4th, 2014 (Independence Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "TGPCamelLabels7.h" - -@interface TGPCamelLabels7() -@property (nonatomic, assign) NSUInteger lastValue; -@property (nonatomic, retain) NSMutableArray * upLabels; -@property (nonatomic, retain) NSMutableArray * dnLabels; -@end - -@implementation TGPCamelLabels7 - -#pragma mark properties - -- (void)setTickCount:(NSUInteger)tickCount { - // calculated property - // Put some order to tickCount: 1 >= count >= 128 - const unsigned int count = (unsigned int) MAX(1, MIN(tickCount, 128)); - [self debugNames:count]; - [self layoutTrack]; -} - -- (NSUInteger)tickCount { - // Dynamic property - return [_names count]; -} - -- (void)setTicksDistance:(CGFloat)ticksDistance { - _ticksDistance = MAX(0, ticksDistance); - [self layoutTrack]; -} - -- (void)setValue:(NSUInteger)value { - _value = value; - [self dockEffect:self.animationDuration]; -} - -- (void)setUpFontName:(NSString *)upFontName { - _upFontName = upFontName; - [self layoutTrack]; -} - -- (void)setUpFontSize:(CGFloat)upFontSize { - _upFontSize = upFontSize; - [self layoutTrack]; -} - -- (void)setUpFontColor:(UIColor *)upFontColor { - _upFontColor = upFontColor; - [self layoutTrack]; -} - -- (void)setDownFontName:(NSString *)downFontName { - _downFontName = downFontName; - [self layoutTrack]; -} - -- (void)setDownFontSize:(CGFloat)downFontSize { - _downFontSize = downFontSize; - [self layoutTrack]; -} - -- (void)setDownFontColor:(UIColor *)downFontColor { - _downFontColor = downFontColor; - [self layoutTrack]; -} - -// NSArray -- (void)setNames:(NSArray *)names { - NSAssert(names.count > 0, @"names.count"); - _names = names; - [self layoutTrack]; -} - -#pragma mark UIView - -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if(self != nil) { - [self initProperties]; - } - return self; -} - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if(self != nil) { - [self initProperties]; - } - return self; -} - -// When bounds change, recalculate layout -- (void)setBounds:(CGRect)bounds -{ - [super setBounds:bounds]; - [self layoutTrack]; - [self setNeedsDisplay]; -} - -// clickthrough --(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { - for (UIView *view in self.subviews) { - if (!view.hidden && view.alpha > 0 && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) - return YES; - } - return NO; -} - -#pragma mark TGPCamelLabels - -- (void)initProperties { - _ticksDistance = 44.0; - _value = 0; - [self debugNames:10]; - - _upFontName = nil; - _upFontSize = 12; - _upFontColor = nil; - - _downFontName = nil; - _downFontSize = 12; - _downFontColor = nil; - - _upLabels = [NSMutableArray array]; - _dnLabels = [NSMutableArray array]; - - _lastValue = NSNotFound; // Never tapped - _animationDuration = 0.15; - - _animate = YES; - - [self layoutTrack]; -} - -- (void)debugNames:(unsigned int)count { - // Dynamic property, will create an array with labels, generally for debugging purposes - const NSMutableArray * array = [NSMutableArray array]; - for(int iterate = 1; iterate <= count; iterate++) { - [array addObject:[NSString stringWithFormat:@"%d", iterate ]]; - } - [self setNames:(NSArray *) array]; -} - -- (void)layoutTrack { - [self.upLabels enumerateObjectsUsingBlock:^(UIView * view, NSUInteger idx, BOOL *stop) { - [view removeFromSuperview]; - }]; - [self.upLabels removeAllObjects]; - [self.dnLabels enumerateObjectsUsingBlock:^(UIView * view, NSUInteger idx, BOOL *stop) { - [view removeFromSuperview]; - }]; - [self.dnLabels removeAllObjects]; - - const NSUInteger count = self.names.count; - if( count > 0) { - CGFloat centerX = (self.bounds.size.width - ((count - 1) * self.ticksDistance))/2.0; - const CGFloat centerY = self.bounds.size.height / 2.0; - for(NSString * name in self.names) { - UILabel * upLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - [self.upLabels addObject:upLabel]; - upLabel.text = name; - upLabel.font = ((self.upFontName != nil) - ? [UIFont fontWithName:self.upFontName size:self.upFontSize] - : [UIFont boldSystemFontOfSize:self.upFontSize]); - upLabel.textColor = ((self.upFontColor != nil) - ? self.upFontColor - : self.tintColor); - [upLabel sizeToFit]; - upLabel.center = CGPointMake(centerX, centerY); - upLabel.frame = ({ - CGRect frame = upLabel.frame; - // frame.origin.y = 0; - frame.origin.y = self.bounds.size.height - frame.size.height; - frame; - }); - upLabel.alpha = 0.0; - [self addSubview:upLabel]; - - UILabel * dnLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - [self.dnLabels addObject:dnLabel]; - dnLabel.text = name; - dnLabel.font = ((self.downFontName != nil) - ? [UIFont fontWithName:self.downFontName size:self.downFontSize] - : [UIFont boldSystemFontOfSize:self.downFontSize]); - dnLabel.textColor = ((self.downFontColor != nil) - ? self.downFontColor - : [UIColor grayColor]); - [dnLabel sizeToFit]; - dnLabel.center = CGPointMake(centerX, centerY); - dnLabel.frame = ({ - CGRect frame = dnLabel.frame; - frame.origin.y = self.bounds.size.height - frame.size.height; - frame; - }); - [self addSubview:dnLabel]; - - centerX += self.ticksDistance; - } - [self dockEffect:0.0]; - } -} - -- (void)dockEffect:(NSTimeInterval)duration -{ - const NSUInteger up = self.value; - - // Unlike the National Parks from which it is inspired, this Dock Effect - // does not abruptly change from BOLD to plain. Instead, we have 2 sets of - // labels, which are faded back and forth, in unisson. - // - BOLD to plain - // - Black to gray - // - high to low - // Each animation picks up where the previous left off - void (^moveBlock)() = ^void() { - // Bring almost all down - [self.upLabels enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if( up != idx) { - [self moveDown:obj withAlpha:0.f]; - } - }]; - [self.dnLabels enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if( up != idx) { - [self moveDown:obj withAlpha:1.f]; - } - }]; - - // Bring the selection up - if(up < [self.upLabels count]) { - [self moveUp:[self.upLabels objectAtIndex:up] withAlpha:1.f]; - } - if(up < [self.dnLabels count]) { - [self moveUp:[self.dnLabels objectAtIndex:up] withAlpha:0.f]; - } - }; - - if(duration > 0) { - [UIView animateWithDuration:duration - delay:0 - options:(UIViewAnimationOptionBeginFromCurrentState + - UIViewAnimationOptionCurveLinear) - animations:moveBlock - completion:nil]; - } else { - moveBlock(); - } -} - -- (void)moveDown:(UIView*)aView withAlpha:(CGFloat) alpha -{ - if (self.animate) { - aView.frame = ({ - CGRect frame = aView.frame; - frame.origin.y = self.bounds.size.height - frame.size.height; - frame; - }); - } - [aView setAlpha:alpha]; -} - -- (void)moveUp:(UIView*)aView withAlpha:(CGFloat) alpha -{ - if (self.animate) { - aView.frame = ({ - CGRect frame = aView.frame; - frame.origin.y = 0; - frame; - }); - } - [aView setAlpha:alpha]; -} - -#pragma mark - TGPControlsTicksProtocol - -- (void)tgpTicksDistanceChanged:(CGFloat)ticksDistance sender:(id)sender -{ - self.ticksDistance = ticksDistance; -} - -- (void)tgpValueChanged:(unsigned int)value -{ - self.value = value; -} -@end diff --git a/TGPControls/TGPControlsTicksProtocol.h b/TGPControls/TGPControlsTicksProtocol.h deleted file mode 100644 index 9675f88..0000000 --- a/TGPControls/TGPControlsTicksProtocol.h +++ /dev/null @@ -1,38 +0,0 @@ -// @file: TGPControlsTicksProtocol.h -// @project: TGPControls -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -@protocol TGPControlsTicksProtocol - -@required -- (void)tgpTicksDistanceChanged:(CGFloat)ticksDistance sender:(id)sender; - -@optional -- (void)tgpValueChanged:(unsigned int)value; -@end diff --git a/TGPControls/TGPDiscreteSlider.h b/TGPControls/TGPDiscreteSlider.h deleted file mode 100644 index fe55a75..0000000 --- a/TGPControls/TGPDiscreteSlider.h +++ /dev/null @@ -1,60 +0,0 @@ -// @file: TGPDiscreteSlider.h -// @project: TGPControls -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "TGPDiscreteSlider7.h" - -IB_DESIGNABLE -@interface TGPDiscreteSlider : TGPDiscreteSlider7 - -@property (nonatomic) IBInspectable int tickStyle; -@property (nonatomic) IBInspectable CGSize tickSize; -@property (nonatomic) IBInspectable int tickCount; -@property (nonatomic) IBInspectable NSString * tickImage; - -@property (nonatomic) IBInspectable int trackStyle; -@property (nonatomic) IBInspectable CGFloat trackThickness; -@property (nonatomic) IBInspectable NSString * trackImage; -@property (nonatomic) IBInspectable UIColor * minimumTrackTintColor; -@property (nonatomic) IBInspectable UIColor * maximumTrackTintColor; - -@property (nonatomic) IBInspectable int thumbStyle; -@property (nonatomic) IBInspectable CGSize thumbSize; -@property (nonatomic) IBInspectable UIColor * thumbTintColor; -@property (nonatomic) IBInspectable CGFloat thumbSRadius; -@property (nonatomic) IBInspectable CGSize thumbSOffset; -@property (nonatomic) IBInspectable NSString * thumbImage; - -// AKA: UISlider value (as CGFloat for compatibility with UISlider API, but expected to contain integers) -@property (nonatomic) IBInspectable CGFloat minimumValue; -@property (nonatomic) IBInspectable CGFloat value; - -@property (nonatomic) IBInspectable int incrementValue; - -@end diff --git a/TGPControls/TGPDiscreteSlider.m b/TGPControls/TGPDiscreteSlider.m deleted file mode 100644 index 3957b99..0000000 --- a/TGPControls/TGPDiscreteSlider.m +++ /dev/null @@ -1,64 +0,0 @@ -// @file: TGPDiscreteSlider.m -// @project: TGPControls -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "TGPDiscreteSlider.h" - -@implementation TGPDiscreteSlider - -@dynamic tickStyle; -@dynamic tickSize; -@dynamic tickCount; -@dynamic tickImage; -@dynamic trackStyle; -@dynamic trackThickness; -@dynamic trackImage; -@dynamic minimumTrackTintColor; -@dynamic maximumTrackTintColor; -@dynamic thumbStyle; -@dynamic thumbSize; -@dynamic thumbTintColor; -@dynamic thumbImage; -@dynamic minimumValue; -@dynamic value; -@dynamic incrementValue; - -#pragma mark properties - -- (void)setThumbSRadius:(CGFloat)thumbSRadius { - // adapter - self.thumbShadowRadius = thumbSRadius; -} - -- (void)setThumbSOffset:(CGSize)thumbSOffset { - // adapter - self.thumbShadowOffset = thumbSOffset; -} - -@end diff --git a/TGPControls/TGPDiscreteSlider7.h b/TGPControls/TGPDiscreteSlider7.h deleted file mode 100644 index 7b2ff51..0000000 --- a/TGPControls/TGPDiscreteSlider7.h +++ /dev/null @@ -1,79 +0,0 @@ -// @file: TGPDiscreteSlider7.h -// @project: TGPControls -// -// @history: Created July 4th, 2014 (Independence Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import -#import "TGPControlsTicksProtocol.h" - -@interface TGPDiscreteSlider7 : - -// Interface builder hides the IBInspectable for UIControl -#if TARGET_INTERFACE_BUILDER -UIView -#else // !TARGET_INTERFACE_BUILDER -UIControl -#endif // TARGET_INTERFACE_BUILDER - -typedef NS_ENUM(int, ComponentStyle) { - ComponentStyleIOS = 0, - ComponentStyleRectangular, - ComponentStyleRounded, - ComponentStyleInvisible, - ComponentStyleImage -}; - -@property (nonatomic, assign) ComponentStyle tickStyle; -@property (nonatomic, assign) CGSize tickSize; -@property (nonatomic, assign) int tickCount; -@property (nonatomic, readonly) CGFloat ticksDistance; -@property (nonatomic, strong) NSString * tickImage; - - -@property (nonatomic, assign) ComponentStyle trackStyle; -@property (nonatomic, assign) CGFloat trackThickness; -@property (nonatomic, strong) NSString * trackImage; -@property (nonatomic, strong) UIColor * minimumTrackTintColor; -@property (nonatomic, strong) UIColor * maximumTrackTintColor; - -@property (nonatomic, assign) ComponentStyle thumbStyle; -@property (nonatomic, assign) CGSize thumbSize; -@property (nonatomic, strong) UIColor * thumbTintColor; -@property (nonatomic, assign) CGFloat thumbShadowRadius; -@property (nonatomic, assign) CGSize thumbShadowOffset; -@property (nonatomic, strong) NSString * thumbImage; - -@property (nonatomic, weak) NSObject * ticksListener; - -// AKA: UISlider value (as CGFloat for compatibility with UISlider API, but expected to contain integers) -@property (nonatomic, assign) CGFloat minimumValue; -@property (nonatomic, assign) CGFloat value; - -@property (nonatomic, assign) int incrementValue; - -@end diff --git a/TGPControls/TGPDiscreteSlider7.m b/TGPControls/TGPDiscreteSlider7.m deleted file mode 100644 index a57c447..0000000 --- a/TGPControls/TGPDiscreteSlider7.m +++ /dev/null @@ -1,726 +0,0 @@ -// @file: TGPDiscreteSlider7.m -// @project: TGPControls -// -// @history: Created July 4th, 2014 (Independence Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "TGPDiscreteSlider7.h" - -static CGFloat iOSThumbShadowRadius = 4.0; -static CGSize iosThumbShadowOffset = (CGSize){0, 3}; - -@interface TGPDiscreteSlider7 () { - int _intValue; - int _intMinimumValue; -} -@property (nonatomic) NSMutableArray * ticksAbscisses; -@property (nonatomic, assign) CGFloat thumbAbscisse; -@property (nonatomic) CALayer * thumbLayer; -@property (nonatomic) CALayer * leftTrackLayer; -@property (nonatomic) CALayer * rightTrackLayer; -@property (nonatomic) CALayer * trackLayer; -@property (nonatomic) CALayer * ticksLayer; -@property (nonatomic) CGRect trackRectangle; -@property (nonatomic) BOOL touchedInside; -@end - -@implementation TGPDiscreteSlider7 - -#pragma mark properties - -- (void)setTickStyle:(ComponentStyle)tickStyle { - _tickStyle = tickStyle; - [self layoutTrack]; -} - -- (void)setTickSize:(CGSize)tickSize { - _tickSize.width = MAX(0, tickSize.width); - _tickSize.height = MAX(0, tickSize.height); - [self layoutTrack]; -} - -- (void)setTickCount:(int)tickCount { - _tickCount = MAX(2, tickCount); - [self layoutTrack]; -} - -- (CGFloat)ticksDistance { - NSAssert1(self.tickCount > 1, @"2 ticks minimum %d", self.tickCount); - const unsigned int segments = MAX(1, self.tickCount - 1); - return (self.trackRectangle.size.width / segments); -} - -- (void)setTickImage:(NSString *)tickImage { - _tickImage = tickImage; - [self layoutTrack]; -} - -- (void)setTintColor:(UIColor *)tintColor { - [super setTintColor:tintColor]; - [self layoutTrack]; -} - -- (void)setTrackStyle:(ComponentStyle)trackStyle { - _trackStyle = trackStyle; - [self layoutTrack]; -} - -- (void)setTrackThickness:(CGFloat)trackThickness { - _trackThickness = MAX(0, trackThickness); - [self layoutTrack]; -} - -- (void)setTrackImage:(NSString *)trackImage { - _trackImage = trackImage; - [self layoutTrack]; -} - -- (void)setMinimumTrackTintColor:(UIColor *)minimumTrackTintColor { - _minimumTrackTintColor = minimumTrackTintColor; - [self layoutTrack]; -} - -- (void)setMaximumTrackTintColor:(UIColor *)maximumTrackTintColor { - _maximumTrackTintColor = maximumTrackTintColor; - [self layoutTrack]; -} - -- (void)setThumbStyle:(ComponentStyle)thumbStyle { - _thumbStyle = thumbStyle; - [self layoutTrack]; -} - -- (void)setThumbSize:(CGSize)thumbSize { - _thumbSize.width = MAX(1, thumbSize.width); - _thumbSize.height = MAX(1, thumbSize.height); - [self layoutTrack]; -} - -- (void)setThumbTintColor:(UIColor *)thumbTintColor { - _thumbTintColor = thumbTintColor; - [self layoutTrack]; -} - -- (void)setThumbImage:(NSString *)thumbImage { - _thumbImage = thumbImage; - - // Associate image to layer - NSString * imageName = self.thumbImage; - if(imageName.length > 0) { - UIImage * image = [UIImage imageNamed:imageName]; //[NSBundle bundleForClass:[self class]] - self.thumbLayer.contents = (id)image.CGImage; - } - - [self layoutTrack]; -} - -- (void)setThumbShadowRadius:(CGFloat)thumbShadowRadius { - _thumbShadowRadius = thumbShadowRadius; - [self layoutTrack]; -} - -- (void)setThumbShadowOffset:(CGSize)thumbShadowOffset { - _thumbShadowOffset = thumbShadowOffset; - [self layoutTrack]; -} - -- (void)setTicksListener:(NSObject *)ticksListener { - _ticksListener = ticksListener; - [self.ticksListener tgpTicksDistanceChanged:self.ticksDistance sender:self]; -} - -- (void)setIncrementValue:(int)incrementValue { - _incrementValue = incrementValue; - if(0 == incrementValue) { - _incrementValue = 1; // nonZeroIncrement - } - [self layoutTrack]; -} - -// AKA: UISlider value (as CGFloat for compatibility with UISlider API, but expected to contain integers) -- (void)setMinimumValue:(CGFloat)minimumValue { - _intMinimumValue = minimumValue; - [self layoutTrack]; -} - -- (CGFloat)minimumValue { - return _intMinimumValue; // calculated property, with a float-to-int adapter -} - -- (void)setValue:(CGFloat)value { - const unsigned int nonZeroIncrement = ((0 == _incrementValue) ? 1 : _incrementValue); - const int rootValue = ((value - self.minimumValue) / nonZeroIncrement); - _intValue = self.minimumValue + (int)(rootValue * nonZeroIncrement); - [self layoutTrack]; -} - -- (CGFloat)value { - return _intValue; // calculated property, with a float-to-int adapter -} - -// When bounds change, recalculate layout -- (void)setBounds:(CGRect)bounds -{ - [super setBounds:bounds]; - [self layoutTrack]; -} - -#pragma mark UIControl - -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if(self != nil) { - [self initProperties]; - } - return self; -} - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if(self != nil) { - [self initProperties]; - } - return self; -} - -- (void)drawRect:(CGRect)rect { - [self drawTrack]; - [self drawTicks]; - [self drawThumb]; -} - -- (void)sendActionsForControlEvents { - // Automatic UIControlEventValueChanged notification - if([self.ticksListener respondsToSelector:@selector(tgpValueChanged:)]) { - [self.ticksListener tgpValueChanged:self.value]; - } -} - -#pragma mark TGPDiscreteSlider7 - -- (void)initProperties { - _tickStyle = ComponentStyleRectangular; - _tickSize = (CGSize) {1.0, 4.0}; - _tickCount = 11; - _trackStyle = ComponentStyleIOS; - _trackThickness = 2.0; - _minimumTrackTintColor = nil; - _maximumTrackTintColor = [UIColor colorWithWhite:0.71 alpha:1]; - _thumbStyle = ComponentStyleIOS; - _thumbSize = (CGSize) {10.0, 10.0}; - _thumbTintColor = nil; - _thumbShadowRadius = 0.0; - _thumbShadowOffset = CGSizeZero; - _intMinimumValue = -5; - _incrementValue = 1; - _intValue = 0; - _ticksAbscisses = [NSMutableArray array]; - _thumbAbscisse = 0.0; - _trackRectangle = CGRectZero; - - // Track is a clear clipping layer, and left + right sublayers, which brings in free animation - _trackLayer = [CALayer layer]; - _trackLayer.masksToBounds = YES; - _trackLayer.backgroundColor = [[UIColor clearColor] CGColor]; - [self.layer addSublayer:self.trackLayer]; - _leftTrackLayer = [CALayer layer]; - _leftTrackLayer.backgroundColor = [self.tintColor CGColor]; - [self.trackLayer addSublayer:self.leftTrackLayer]; - _rightTrackLayer = [CALayer layer]; - _rightTrackLayer.backgroundColor = [self.maximumTrackTintColor CGColor]; - [self.trackLayer addSublayer:self.rightTrackLayer]; - - // Ticks in between track and thumb - _ticksLayer = [CALayer layer]; - [self.layer addSublayer:self.ticksLayer]; - - // The thumb is its own CALayer, which brings in free animation - _thumbLayer = [CALayer layer]; - [self.layer addSublayer:self.thumbLayer]; - - self.multipleTouchEnabled = NO; - [self layoutTrack]; -} - -- (void)drawTicks { - self.ticksLayer.frame = self.bounds; - self.ticksLayer.backgroundColor = [self.tintColor CGColor]; - - UIBezierPath *path = [UIBezierPath bezierPath]; - - switch (self.tickStyle) { - case ComponentStyleRounded: - case ComponentStyleRectangular: - case ComponentStyleImage: { - NSAssert(nil != self.ticksAbscisses, @"ticksAbscisses"); - if(nil != self.ticksAbscisses) { - - for(NSValue * originValue in self.ticksAbscisses) { - CGPoint originPoint = [originValue CGPointValue]; - CGRect rectangle = CGRectMake(originPoint.x-(self.tickSize.width/2), - originPoint.y-(self.tickSize.height/2), - self.tickSize.width, self.tickSize.height); - switch(self.tickStyle) { - case ComponentStyleRounded: { - [path appendPath:[UIBezierPath bezierPathWithRoundedRect:rectangle - cornerRadius:rectangle.size.height/2]]; - break; - } - - case ComponentStyleRectangular: - [path appendPath:[UIBezierPath bezierPathWithRect:rectangle]]; - break; - - case ComponentStyleImage: { - // Draw image if exists - NSString * imageName = self.tickImage; - if(imageName.length > 0) { - UIImage * image = [UIImage imageNamed:imageName]; //[NSBundle bundleForClass:[self class]] - if(image) { - CGRect centered = CGRectMake(rectangle.origin.x + (rectangle.size.width/2) - (image.size.width/2), - rectangle.origin.y + (rectangle.size.height/2) - (image.size.height/2), - image.size.width, - image.size.height); - const CGContextRef ctx = UIGraphicsGetCurrentContext(); - CGContextDrawImage(ctx, centered, image.CGImage); - } - } - break; - } - - case ComponentStyleInvisible: - case ComponentStyleIOS: - default: - NSAssert(FALSE, @"ComponentStyleInvisible, ComponentStyleIOS, default"); - break; - } - } - } - break; - } - - case ComponentStyleInvisible: - case ComponentStyleIOS: - default: - // Nothing to draw - break; - } - - CAShapeLayer *maskLayer = [CAShapeLayer layer]; - maskLayer.frame = self.trackLayer.bounds; - maskLayer.path = path.CGPath; - self.ticksLayer.mask = maskLayer; -} - -- (void)drawTrack { - switch(self.trackStyle) { - case ComponentStyleRectangular: - self.trackLayer.frame = self.trackRectangle; - self.trackLayer.cornerRadius = 0.0; - break; - - case ComponentStyleInvisible: - self.trackLayer.frame = CGRectZero; - break; - - case ComponentStyleImage: { - self.trackLayer.frame = CGRectZero; - - // Draw image if exists - NSString * imageName = self.trackImage; - if(imageName.length > 0) { - UIImage * image = [UIImage imageNamed:imageName]; //[NSBundle bundleForClass:[self class]] - if(image) { - CGRect centered = CGRectMake((self.frame.size.width/2) - (image.size.width/2), - (self.frame.size.height/2) - (image.size.height/2), - image.size.width, - image.size.height); - const CGContextRef ctx = UIGraphicsGetCurrentContext(); - CGContextDrawImage(ctx, centered, image.CGImage); - } - } - break; - } - - case ComponentStyleRounded: - case ComponentStyleIOS: - default: - self.trackLayer.frame = self.trackRectangle; - self.trackLayer.cornerRadius = CGRectGetHeight(self.trackRectangle)/2.0; - break; - } - - self.leftTrackLayer.frame = ({ - CGRect frame = self.trackLayer.bounds; - frame.size.width = self.thumbAbscisse - CGRectGetMinX(self.trackRectangle); - frame; - }); - self.leftTrackLayer.backgroundColor = ((nil == self.minimumTrackTintColor) - ? [self.tintColor CGColor] - : [self.minimumTrackTintColor CGColor]); - - self.rightTrackLayer.frame = ({ - CGRect frame = self.trackLayer.bounds; - frame.size.width = CGRectGetWidth(self.trackRectangle) - CGRectGetWidth(self.leftTrackLayer.frame); - frame.origin.x = CGRectGetMaxX(self.leftTrackLayer.frame); - frame; - }); - self.rightTrackLayer.backgroundColor = [self.maximumTrackTintColor CGColor]; -} - -- (void)drawThumb { - if( self.value >= self.minimumValue) { // Feature: hide the thumb when below range - - const CGSize thumbSizeForStyle = [self thumbSizeIncludingShadow]; - const CGFloat thumbWidth = thumbSizeForStyle.width; - const CGFloat thumbHeight = thumbSizeForStyle.height; - const CGRect rectangle = CGRectMake(self.thumbAbscisse - (thumbWidth / 2), - (self.frame.size.height - thumbHeight)/2, - thumbWidth, - thumbHeight); - - const CGFloat shadowRadius = ((self.thumbStyle == ComponentStyleIOS) - ? iOSThumbShadowRadius - : self.thumbShadowRadius); - const CGSize shadowOffset = ((self.thumbStyle == ComponentStyleIOS) - ? iosThumbShadowOffset - : self.thumbShadowOffset); - - self.thumbLayer.frame = ((shadowRadius != 0.0) // Ignore offset if there is no shadow - ? CGRectInset(rectangle, - shadowRadius + shadowOffset.width, - shadowRadius + shadowOffset.height) - : CGRectInset(rectangle, shadowRadius, shadowRadius)); - - switch(self.thumbStyle) { - case ComponentStyleRounded: // A rounded thumb is circular - self.thumbLayer.backgroundColor = ((nil == self.thumbTintColor) - ? [[UIColor lightGrayColor] CGColor] - : [self.thumbTintColor CGColor]); - self.thumbLayer.borderColor = [[UIColor clearColor] CGColor]; - self.thumbLayer.borderWidth = 0.0; - self.thumbLayer.cornerRadius = self.thumbLayer.frame.size.width/2; - self.thumbLayer.allowsEdgeAntialiasing = YES; - break; - - case ComponentStyleImage: { - // image is set using layer.contents - self.thumbLayer.backgroundColor = [[UIColor clearColor] CGColor]; - self.thumbLayer.borderColor = [[UIColor clearColor] CGColor]; - self.thumbLayer.borderWidth = 0.0; - self.thumbLayer.cornerRadius = 0.0; - self.thumbLayer.allowsEdgeAntialiasing = NO; - break; - } - - case ComponentStyleRectangular: - self.thumbLayer.backgroundColor = ((nil == self.thumbTintColor) - ? [[UIColor lightGrayColor] CGColor] - : [self.thumbTintColor CGColor]); - self.thumbLayer.borderColor = [[UIColor clearColor] CGColor]; - self.thumbLayer.borderWidth = 0.0; - self.thumbLayer.cornerRadius = 0.0; - self.thumbLayer.allowsEdgeAntialiasing = NO; - break; - - case ComponentStyleInvisible: - self.thumbLayer.backgroundColor = [[UIColor clearColor] CGColor]; - self.thumbLayer.cornerRadius = 0.0; - break; - - case ComponentStyleIOS: - default: { - UIColor * backgroundColor = ((nil == self.thumbTintColor) - ? [UIColor whiteColor] - : self.thumbTintColor); - self.thumbLayer.backgroundColor = [backgroundColor CGColor]; - // Only default iOS thumb has a border - if(nil == self.thumbTintColor) { - const UIColor * borderColor = [UIColor colorWithWhite:0.5 alpha: 1]; - self.thumbLayer.borderColor = [borderColor CGColor]; - self.thumbLayer.borderWidth = 0.25; - } else { - self.thumbLayer.borderWidth = 0; - } - self.thumbLayer.cornerRadius = self.thumbLayer.frame.size.width/2; - self.thumbLayer.allowsEdgeAntialiasing = YES; - break; - } - } - - // Shadow - if(shadowRadius != 0.0) { -#if TARGET_INTERFACE_BUILDER - self.thumbLayer.shadowOffset = CGSizeMake(shadowOffset.width, -shadowOffset.height); -#else // !TARGET_INTERFACE_BUILDER - self.thumbLayer.shadowOffset = shadowOffset; -#endif // TARGET_INTERFACE_BUILDER - - self.thumbLayer.shadowRadius = shadowRadius; - self.thumbLayer.shadowColor = [[UIColor blackColor] CGColor]; - self.thumbLayer.shadowOpacity = 0.15; - } else { - self.thumbLayer.shadowRadius = 0.0; - self.thumbLayer.shadowOffset = CGSizeZero; - self.thumbLayer.shadowColor = [[UIColor clearColor] CGColor]; - self.thumbLayer.shadowOpacity = 0.0; - } - } -} - -- (void)layoutTrack { - NSAssert1(self.tickCount > 1, @"2 ticks minimum %d", self.tickCount); - const unsigned int segments = MAX(1, self.tickCount - 1); - const CGFloat thumbWidth = [self thumbSizeIncludingShadow].width; - - // Calculate the track ticks positions - const CGFloat trackHeight = ((ComponentStyleIOS == self.trackStyle) - ? 2.0 - : self.trackThickness); - CGSize trackSize = CGSizeMake(self.frame.size.width - thumbWidth, trackHeight); - if(ComponentStyleImage == self.trackStyle) { - NSString * imageName = self.trackImage; - if(imageName.length > 0) { - UIImage * image = [UIImage imageNamed:imageName]; //[NSBundle bundleForClass:[self class]] - if(image) { - trackSize.width = image.size.width - thumbWidth; - } - } - } - - self.trackRectangle = CGRectMake((self.frame.size.width - trackSize.width)/2, - (self.frame.size.height - trackSize.height)/2, - trackSize.width, - trackSize.height); - const CGFloat trackY = self.frame.size.height / 2; - [self.ticksAbscisses removeAllObjects]; - for( int iterate = 0; iterate <= segments; iterate++) { - const double ratio = (double)iterate / (double)segments; - const CGFloat originX = self.trackRectangle.origin.x + (CGFloat)(trackSize.width * ratio); - [self.ticksAbscisses addObject: [NSValue valueWithCGPoint:CGPointMake(originX, trackY)]]; - } - [self layoutThumb]; - - // If we have a TGPDiscreteSliderTicksListener (such as TGPCamelLabels), broadcast new spacing - [self.ticksListener tgpTicksDistanceChanged:self.ticksDistance sender:self]; - [self setNeedsDisplay]; -} - -- (void)layoutThumb { - NSAssert1(self.tickCount > 1, @"2 ticks minimum %d", self.tickCount); - const unsigned int segments = MAX(1, self.tickCount - 1); - - // Calculate the thumb position - const unsigned int nonZeroIncrement = ((0 == self.incrementValue) ? 1 : self.incrementValue); - double thumbRatio = (double)(self.value - self.minimumValue) / (double)(segments * nonZeroIncrement); - thumbRatio = MAX(0.0, MIN(thumbRatio, 1.0)); // Normalized - self.thumbAbscisse = self.trackRectangle.origin.x + (self.trackRectangle.size.width * thumbRatio); -} - -- (CGSize)thumbSizeIncludingShadow { - switch (self.thumbStyle) { - case ComponentStyleInvisible: - case ComponentStyleRectangular: - case ComponentStyleRounded: - return ((self.thumbShadowRadius != 0.0) - ? CGSizeMake(self.thumbSize.width - + (self.thumbShadowRadius * 2) - + (self.thumbShadowOffset.width * 2), - self.thumbSize.height - + (self.thumbShadowRadius * 2) - + (self.thumbShadowOffset.height * 2)) - : self.thumbSize); - - case ComponentStyleIOS: - return CGSizeMake(28.0 - + (iOSThumbShadowRadius * 2) - + (iosThumbShadowOffset.width * 2), - 28.0 - + (iOSThumbShadowRadius * 2) - + (iosThumbShadowOffset.height * 2)); - - case ComponentStyleImage: { - NSString * imageName = self.thumbImage; - if (imageName.length > 0) { - return [UIImage imageNamed:imageName].size; - } - // Fall through - } - - default: - return (CGSize){33.0, 33.0}; - } -} - -#pragma mark UIResponder - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { - self.touchedInside = YES; - - [self touchDown:touches animationDuration:0.1]; - [self sendActionForControlEvent:UIControlEventValueChanged forEvent:event]; - [self sendActionForControlEvent:UIControlEventTouchDown forEvent:event]; - - const UITouch * touch = [touches anyObject]; - if(nil != touch) { - if(touch.tapCount > 1) { - [self sendActionForControlEvent:UIControlEventTouchDownRepeat forEvent:event]; - } - } -} - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - [self touchDown:touches animationDuration:0.0]; - - BOOL inside = [self touchesAreInside:touches]; - - [self sendActionForControlEvent:UIControlEventValueChanged forEvent:event]; - // Crossing boundary - if(inside != self.touchedInside) { - [self sendActionForControlEvent:((inside) - ? UIControlEventTouchDragEnter - : UIControlEventTouchDragExit) - forEvent:event]; - self.touchedInside = inside; - } - // Drag - [self sendActionForControlEvent:((inside) - ? UIControlEventTouchDragInside - : UIControlEventTouchDragOutside) - forEvent:event]; -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - [self touchUp:touches]; - - [self sendActionForControlEvent:UIControlEventValueChanged forEvent:event]; - [self sendActionForControlEvent:(([self touchesAreInside:touches]) - ? UIControlEventTouchUpInside - : UIControlEventTouchUpOutside) - forEvent:event]; -} - -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { - [self touchUp:touches]; - - [self sendActionForControlEvent:UIControlEventValueChanged forEvent:event]; - [self sendActionForControlEvent:UIControlEventTouchCancel forEvent:event]; -} - -#pragma mark Touches - -- (void)touchDown:(NSSet *)touches animationDuration:(NSTimeInterval)duration { - const UITouch * touch = [touches anyObject]; - if(nil != touch) { - const CGPoint location = [touch locationInView:touch.view]; - [self moveThumbTo:location.x animationDuration:duration]; - } -} - -- (void)touchUp:(NSSet *)touches { - const UITouch * touch = [touches anyObject]; - if(nil != touch) { - const CGPoint location = [touch locationInView:touch.view]; - const unsigned int tick = [self pickTickFromSliderPosition:location.x]; - [self moveThumbToTick:tick]; - } -} - -- (BOOL)touchesAreInside:(NSSet *)touches { - BOOL inside = NO; - const UITouch * touch = [touches anyObject]; - if(nil != touch) { - const CGPoint location = [touch locationInView:touch.view]; - inside = CGRectContainsPoint(touch.view.bounds, location); - } - return inside; -} - -#pragma mark Notifications - -- (void)moveThumbToTick:(unsigned int)tick { - const unsigned int nonZeroIncrement = ((0 == self.incrementValue) ? 1 : self.incrementValue); - int intValue = self.minimumValue + (tick * nonZeroIncrement); - if( intValue != _intValue) { - _intValue = intValue; - [self sendActionsForControlEvents]; - } - - [self layoutThumb]; - [self setNeedsDisplay]; -} - -- (void)moveThumbTo:(CGFloat)abscisse animationDuration:(CFTimeInterval)duration { - const CGFloat leftMost = CGRectGetMinX(self.trackRectangle); - const CGFloat rightMost = CGRectGetMaxX(self.trackRectangle); - - self.thumbAbscisse = MAX(leftMost, MIN(abscisse, rightMost)); - [CATransaction setAnimationDuration:duration]; - - const unsigned int tick = [self pickTickFromSliderPosition:self.thumbAbscisse]; - const unsigned int nonZeroIncrement = ((0 == self.incrementValue) ? 1 : self.incrementValue); - int intValue = self.minimumValue + (tick * nonZeroIncrement); - if( intValue != _intValue) { - _intValue = intValue; - [self sendActionsForControlEvents]; - } - - [self setNeedsDisplay]; -} - -- (unsigned int)pickTickFromSliderPosition:(CGFloat)abscisse { - const CGFloat leftMost = CGRectGetMinX(self.trackRectangle); - const CGFloat rightMost = CGRectGetMaxX(self.trackRectangle); - const CGFloat clampedAbscisse = MAX(leftMost, MIN(abscisse, rightMost)); - const double ratio = (double)(clampedAbscisse - leftMost) / (double)(rightMost - leftMost); - const unsigned int segments = MAX(1, self.tickCount - 1); - return (unsigned int) round( (double)segments * ratio); -} - -- (void)sendActionForControlEvent:(UIControlEvents)controlEvent forEvent:(UIEvent *)event { - // Interface builder hides the IBInspectable for UIControl -#if !TARGET_INTERFACE_BUILDER - for (id target in self.allTargets) { - NSArray *actions = [self actionsForTarget:target forControlEvent:controlEvent]; - for (NSString *action in actions) { - [self sendAction:NSSelectorFromString(action) - to:target - forEvent:event]; - - } - } -#endif // !TARGET_INTERFACE_BUILDER -} - -#pragma mark - Interface Builder - -#if TARGET_INTERFACE_BUILDER -// Interface builder hides the IBInspectable for UIControl -- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents {} -#endif // TARGET_INTERFACE_BUILDER - -@end diff --git a/TGPControlsDemo/Podfile b/TGPControlsDemo/Podfile index a4f33c5..ef85fe6 100644 --- a/TGPControlsDemo/Podfile +++ b/TGPControlsDemo/Podfile @@ -1,15 +1,10 @@ -# Requires cocoaPods 0.36.0.beta.2 or better. - -platform :ios, '8.0' -source 'https://github.com/CocoaPods/Specs.git' -use_frameworks! +platform :ios, '9.3' target 'TGPControlsDemo' do - #pod 'TGPControls', :path => '../../TGPControls' - pod 'TGPControls' + use_frameworks! + + # Pods for TGPControlsDemo + pod 'TGPControls', :path => '../../TGPControls' end -target 'TGPControlsDemoTests' do - -end diff --git a/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj b/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj index 70c3617..f68c42f 100644 --- a/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj +++ b/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj @@ -7,150 +7,100 @@ objects = { /* Begin PBXBuildFile section */ - 06B1EA7FFF5C48AB28F48C03 /* Pods_TGPControlsDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D99E06034FFE0CC31C39944E /* Pods_TGPControlsDemo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - DC0B42111A901E59008D679A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC0B42101A901E59008D679A /* AppDelegate.swift */; }; - DC0B42131A901E59008D679A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC0B42121A901E59008D679A /* ViewController.swift */; }; - DC0B42161A901E59008D679A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC0B42141A901E59008D679A /* Main.storyboard */; }; - DC0B42181A901E59008D679A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DC0B42171A901E59008D679A /* Images.xcassets */; }; - DC0B421B1A901E59008D679A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = DC0B42191A901E59008D679A /* LaunchScreen.xib */; }; - DC0B42271A901E59008D679A /* TGPControlsDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC0B42261A901E59008D679A /* TGPControlsDemoTests.swift */; }; + 49DFBE652BC3561E5CB5AC71 /* Pods_TGPControlsDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 581DB63BCDD6158FFB0D74E5 /* Pods_TGPControlsDemo.framework */; }; + DC56BDC71E46DEB900AAD0D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC56BDC61E46DEB900AAD0D9 /* AppDelegate.swift */; }; + DC56BDC91E46DEB900AAD0D9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC56BDC81E46DEB900AAD0D9 /* ViewController.swift */; }; + DC56BDCC1E46DEB900AAD0D9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC56BDCA1E46DEB900AAD0D9 /* Main.storyboard */; }; + DC56BDCE1E46DEB900AAD0D9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DC56BDCD1E46DEB900AAD0D9 /* Assets.xcassets */; }; + DC56BDD11E46DEB900AAD0D9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC56BDCF1E46DEB900AAD0D9 /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - DC0B42211A901E59008D679A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DC0B42031A901E59008D679A /* Project object */; - proxyType = 1; - remoteGlobalIDString = DC0B420A1A901E59008D679A; - remoteInfo = TGPControlsDemo; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ - D99E06034FFE0CC31C39944E /* Pods_TGPControlsDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TGPControlsDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DC0B420B1A901E59008D679A /* TGPControlsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TGPControlsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DC0B420F1A901E59008D679A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DC0B42101A901E59008D679A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - DC0B42121A901E59008D679A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - DC0B42151A901E59008D679A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - DC0B42171A901E59008D679A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - DC0B421A1A901E59008D679A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - DC0B42201A901E59008D679A /* TGPControlsDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TGPControlsDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - DC0B42251A901E59008D679A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DC0B42261A901E59008D679A /* TGPControlsDemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TGPControlsDemoTests.swift; sourceTree = ""; }; - DC0B42301A901F09008D679A /* Podfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Podfile; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - E1E29E38530A3F94DA312C93 /* Pods-TGPControlsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.debug.xcconfig"; sourceTree = ""; }; - EA6AEAFB632330729C70C835 /* Pods-TGPControlsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.release.xcconfig"; sourceTree = ""; }; + 581DB63BCDD6158FFB0D74E5 /* Pods_TGPControlsDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TGPControlsDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 92A7F603AAEAC96A55AB65B0 /* Pods-TGPControlsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.release.xcconfig"; sourceTree = ""; }; + DA8C1E8D17DDF9A4BE0D574A /* Pods-TGPControlsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.debug.xcconfig"; sourceTree = ""; }; + DC56BDC31E46DEB900AAD0D9 /* TGPControlsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TGPControlsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + DC56BDC61E46DEB900AAD0D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + DC56BDC81E46DEB900AAD0D9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + DC56BDCB1E46DEB900AAD0D9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + DC56BDCD1E46DEB900AAD0D9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + DC56BDD01E46DEB900AAD0D9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + DC56BDD21E46DEB900AAD0D9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - DC0B42081A901E59008D679A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 06B1EA7FFF5C48AB28F48C03 /* Pods_TGPControlsDemo.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DC0B421D1A901E59008D679A /* Frameworks */ = { + DC56BDC01E46DEB900AAD0D9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 49DFBE652BC3561E5CB5AC71 /* Pods_TGPControlsDemo.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 43F34D3BAAD6BE92D4D970B5 /* Frameworks */ = { + 4377D1C5D815215296FB706C /* Pods */ = { isa = PBXGroup; children = ( - D99E06034FFE0CC31C39944E /* Pods_TGPControlsDemo.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - C024A6D85198B6A4399C2561 /* Pods */ = { - isa = PBXGroup; - children = ( - E1E29E38530A3F94DA312C93 /* Pods-TGPControlsDemo.debug.xcconfig */, - EA6AEAFB632330729C70C835 /* Pods-TGPControlsDemo.release.xcconfig */, + DA8C1E8D17DDF9A4BE0D574A /* Pods-TGPControlsDemo.debug.xcconfig */, + 92A7F603AAEAC96A55AB65B0 /* Pods-TGPControlsDemo.release.xcconfig */, ); name = Pods; sourceTree = ""; }; - DC0B42021A901E59008D679A = { + 9913583EE20668591C0787BB /* Frameworks */ = { isa = PBXGroup; children = ( - DC0B42301A901F09008D679A /* Podfile */, - DC0B420D1A901E59008D679A /* TGPControlsDemo */, - DC0B42231A901E59008D679A /* TGPControlsDemoTests */, - DC0B420C1A901E59008D679A /* Products */, - C024A6D85198B6A4399C2561 /* Pods */, - 43F34D3BAAD6BE92D4D970B5 /* Frameworks */, + 581DB63BCDD6158FFB0D74E5 /* Pods_TGPControlsDemo.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + DC56BDBA1E46DEB900AAD0D9 = { + isa = PBXGroup; + children = ( + DC56BDC51E46DEB900AAD0D9 /* TGPControlsDemo */, + DC56BDC41E46DEB900AAD0D9 /* Products */, + 4377D1C5D815215296FB706C /* Pods */, + 9913583EE20668591C0787BB /* Frameworks */, ); sourceTree = ""; }; - DC0B420C1A901E59008D679A /* Products */ = { + DC56BDC41E46DEB900AAD0D9 /* Products */ = { isa = PBXGroup; children = ( - DC0B420B1A901E59008D679A /* TGPControlsDemo.app */, - DC0B42201A901E59008D679A /* TGPControlsDemoTests.xctest */, + DC56BDC31E46DEB900AAD0D9 /* TGPControlsDemo.app */, ); name = Products; sourceTree = ""; }; - DC0B420D1A901E59008D679A /* TGPControlsDemo */ = { + DC56BDC51E46DEB900AAD0D9 /* TGPControlsDemo */ = { isa = PBXGroup; children = ( - DC0B42101A901E59008D679A /* AppDelegate.swift */, - DC0B42121A901E59008D679A /* ViewController.swift */, - DC0B42141A901E59008D679A /* Main.storyboard */, - DC0B42171A901E59008D679A /* Images.xcassets */, - DC0B42191A901E59008D679A /* LaunchScreen.xib */, - DC0B420E1A901E59008D679A /* Supporting Files */, + DC56BDC61E46DEB900AAD0D9 /* AppDelegate.swift */, + DC56BDC81E46DEB900AAD0D9 /* ViewController.swift */, + DC56BDCA1E46DEB900AAD0D9 /* Main.storyboard */, + DC56BDCD1E46DEB900AAD0D9 /* Assets.xcassets */, + DC56BDCF1E46DEB900AAD0D9 /* LaunchScreen.storyboard */, + DC56BDD21E46DEB900AAD0D9 /* Info.plist */, ); path = TGPControlsDemo; sourceTree = ""; }; - DC0B420E1A901E59008D679A /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DC0B420F1A901E59008D679A /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - DC0B42231A901E59008D679A /* TGPControlsDemoTests */ = { - isa = PBXGroup; - children = ( - DC0B42261A901E59008D679A /* TGPControlsDemoTests.swift */, - DC0B42241A901E59008D679A /* Supporting Files */, - ); - path = TGPControlsDemoTests; - sourceTree = ""; - }; - DC0B42241A901E59008D679A /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DC0B42251A901E59008D679A /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - DC0B420A1A901E59008D679A /* TGPControlsDemo */ = { + DC56BDC21E46DEB900AAD0D9 /* TGPControlsDemo */ = { isa = PBXNativeTarget; - buildConfigurationList = DC0B422A1A901E59008D679A /* Build configuration list for PBXNativeTarget "TGPControlsDemo" */; + buildConfigurationList = DC56BDD51E46DEB900AAD0D9 /* Build configuration list for PBXNativeTarget "TGPControlsDemo" */; buildPhases = ( - 9DC49ADB016D0365B07A2CE3 /* Check Pods Manifest.lock */, - DC0B42071A901E59008D679A /* Sources */, - DC0B42081A901E59008D679A /* Frameworks */, - DC0B42091A901E59008D679A /* Resources */, - 3FC1CB30371C38246EE22494 /* Copy Pods Resources */, - 6FE2512BFEFD20704B4B9262 /* Embed Pods Frameworks */, + 1934555AC11CDE41167D1F71 /* [CP] Check Pods Manifest.lock */, + DC56BDBF1E46DEB900AAD0D9 /* Sources */, + DC56BDC01E46DEB900AAD0D9 /* Frameworks */, + DC56BDC11E46DEB900AAD0D9 /* Resources */, + A772C50843047EE677ADAF15 /* [CP] Embed Pods Frameworks */, + 3FF2E09CAFA7D92A488FACF7 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -158,47 +108,27 @@ ); name = TGPControlsDemo; productName = TGPControlsDemo; - productReference = DC0B420B1A901E59008D679A /* TGPControlsDemo.app */; + productReference = DC56BDC31E46DEB900AAD0D9 /* TGPControlsDemo.app */; productType = "com.apple.product-type.application"; }; - DC0B421F1A901E59008D679A /* TGPControlsDemoTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DC0B422D1A901E59008D679A /* Build configuration list for PBXNativeTarget "TGPControlsDemoTests" */; - buildPhases = ( - DC0B421C1A901E59008D679A /* Sources */, - DC0B421D1A901E59008D679A /* Frameworks */, - DC0B421E1A901E59008D679A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DC0B42221A901E59008D679A /* PBXTargetDependency */, - ); - name = TGPControlsDemoTests; - productName = TGPControlsDemoTests; - productReference = DC0B42201A901E59008D679A /* TGPControlsDemoTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - DC0B42031A901E59008D679A /* Project object */ = { + DC56BDBB1E46DEB900AAD0D9 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 0710; - ORGANIZATIONNAME = TheGothicParty; + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = SwiftArchitect; TargetAttributes = { - DC0B420A1A901E59008D679A = { - CreatedOnToolsVersion = 6.1.1; - }; - DC0B421F1A901E59008D679A = { - CreatedOnToolsVersion = 6.1.1; - TestTargetID = DC0B420A1A901E59008D679A; + DC56BDC21E46DEB900AAD0D9 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = 55K7THBUV8; + ProvisioningStyle = Automatic; }; }; }; - buildConfigurationList = DC0B42061A901E59008D679A /* Build configuration list for PBXProject "TGPControlsDemo" */; + buildConfigurationList = DC56BDBE1E46DEB900AAD0D9 /* Build configuration list for PBXProject "TGPControlsDemo" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -206,46 +136,53 @@ en, Base, ); - mainGroup = DC0B42021A901E59008D679A; - productRefGroup = DC0B420C1A901E59008D679A /* Products */; + mainGroup = DC56BDBA1E46DEB900AAD0D9; + productRefGroup = DC56BDC41E46DEB900AAD0D9 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - DC0B420A1A901E59008D679A /* TGPControlsDemo */, - DC0B421F1A901E59008D679A /* TGPControlsDemoTests */, + DC56BDC21E46DEB900AAD0D9 /* TGPControlsDemo */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - DC0B42091A901E59008D679A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DC0B42161A901E59008D679A /* Main.storyboard in Resources */, - DC0B421B1A901E59008D679A /* LaunchScreen.xib in Resources */, - DC0B42181A901E59008D679A /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DC0B421E1A901E59008D679A /* Resources */ = { + DC56BDC11E46DEB900AAD0D9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + DC56BDD11E46DEB900AAD0D9 /* LaunchScreen.storyboard in Resources */, + DC56BDCE1E46DEB900AAD0D9 /* Assets.xcassets in Resources */, + DC56BDCC1E46DEB900AAD0D9 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3FC1CB30371C38246EE22494 /* Copy Pods Resources */ = { + 1934555AC11CDE41167D1F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Copy Pods Resources"; + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 3FF2E09CAFA7D92A488FACF7 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -253,14 +190,14 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 6FE2512BFEFD20704B4B9262 /* Embed Pods Frameworks */ = { + A772C50843047EE677ADAF15 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Embed Pods Frameworks"; + name = "[CP] Embed Pods Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -268,75 +205,45 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9DC49ADB016D0365B07A2CE3 /* Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - DC0B42071A901E59008D679A /* Sources */ = { + DC56BDBF1E46DEB900AAD0D9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DC0B42131A901E59008D679A /* ViewController.swift in Sources */, - DC0B42111A901E59008D679A /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DC0B421C1A901E59008D679A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DC0B42271A901E59008D679A /* TGPControlsDemoTests.swift in Sources */, + DC56BDC91E46DEB900AAD0D9 /* ViewController.swift in Sources */, + DC56BDC71E46DEB900AAD0D9 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - DC0B42221A901E59008D679A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DC0B420A1A901E59008D679A /* TGPControlsDemo */; - targetProxy = DC0B42211A901E59008D679A /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ - DC0B42141A901E59008D679A /* Main.storyboard */ = { + DC56BDCA1E46DEB900AAD0D9 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - DC0B42151A901E59008D679A /* Base */, + DC56BDCB1E46DEB900AAD0D9 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - DC0B42191A901E59008D679A /* LaunchScreen.xib */ = { + DC56BDCF1E46DEB900AAD0D9 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - DC0B421A1A901E59008D679A /* Base */, + DC56BDD01E46DEB900AAD0D9 /* Base */, ); - name = LaunchScreen.xib; + name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - DC0B42281A901E59008D679A /* Debug */ = { + DC56BDD31E46DEB900AAD0D9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -344,43 +251,49 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - DC0B42291A901E59008D679A /* Release */ = { + DC56BDD41E46DEB900AAD0D9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -388,124 +301,86 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; - DC0B422B1A901E59008D679A /* Debug */ = { + DC56BDD61E46DEB900AAD0D9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E1E29E38530A3F94DA312C93 /* Pods-TGPControlsDemo.debug.xcconfig */; + baseConfigurationReference = DA8C1E8D17DDF9A4BE0D574A /* Pods-TGPControlsDemo.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 55K7THBUV8; INFOPLIST_FILE = TGPControlsDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.thegothicparty.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = com.swiftarchitect.TGPControlsDemo; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; - DC0B422C1A901E59008D679A /* Release */ = { + DC56BDD71E46DEB900AAD0D9 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EA6AEAFB632330729C70C835 /* Pods-TGPControlsDemo.release.xcconfig */; + baseConfigurationReference = 92A7F603AAEAC96A55AB65B0 /* Pods-TGPControlsDemo.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 55K7THBUV8; INFOPLIST_FILE = TGPControlsDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.thegothicparty.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = com.swiftarchitect.TGPControlsDemo; PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - DC0B422E1A901E59008D679A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = TGPControlsDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.thegothicparty.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TGPControlsDemo.app/TGPControlsDemo"; - }; - name = Debug; - }; - DC0B422F1A901E59008D679A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = TGPControlsDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.thegothicparty.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TGPControlsDemo.app/TGPControlsDemo"; + SWIFT_VERSION = 3.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - DC0B42061A901E59008D679A /* Build configuration list for PBXProject "TGPControlsDemo" */ = { + DC56BDBE1E46DEB900AAD0D9 /* Build configuration list for PBXProject "TGPControlsDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( - DC0B42281A901E59008D679A /* Debug */, - DC0B42291A901E59008D679A /* Release */, + DC56BDD31E46DEB900AAD0D9 /* Debug */, + DC56BDD41E46DEB900AAD0D9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DC0B422A1A901E59008D679A /* Build configuration list for PBXNativeTarget "TGPControlsDemo" */ = { + DC56BDD51E46DEB900AAD0D9 /* Build configuration list for PBXNativeTarget "TGPControlsDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( - DC0B422B1A901E59008D679A /* Debug */, - DC0B422C1A901E59008D679A /* Release */, + DC56BDD61E46DEB900AAD0D9 /* Debug */, + DC56BDD71E46DEB900AAD0D9 /* Release */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DC0B422D1A901E59008D679A /* Build configuration list for PBXNativeTarget "TGPControlsDemoTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC0B422E1A901E59008D679A /* Debug */, - DC0B422F1A901E59008D679A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = DC0B42031A901E59008D679A /* Project object */; + rootObject = DC56BDBB1E46DEB900AAD0D9 /* Project object */; } diff --git a/TGPControlsDemo/TGPControlsDemo/AppDelegate.swift b/TGPControlsDemo/TGPControlsDemo/AppDelegate.swift index c9f825c..e64cea4 100644 --- a/TGPControlsDemo/TGPControlsDemo/AppDelegate.swift +++ b/TGPControlsDemo/TGPControlsDemo/AppDelegate.swift @@ -1,14 +1,4 @@ -// @file: AppDelegate.swift -// @project: TGPControlsDemo (TGPControls) -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott +// Copyright (c) 2017, Xavier Schott // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,30 +26,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // 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. - // 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. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // 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. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication) { - // 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. + func applicationWillEnterForeground(_ application: UIApplication) { + // 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. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // 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. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } diff --git a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 71% rename from TGPControlsDemo/TGPControlsDemo/Images.xcassets/AppIcon.appiconset/Contents.json rename to TGPControlsDemo/TGPControlsDemo/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..1d060ed 100644 --- a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -59,6 +79,11 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" } ], "info" : { diff --git a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/thumb.imageset/Contents.json b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/thumb.imageset/Contents.json similarity index 100% rename from TGPControlsDemo/TGPControlsDemo/Images.xcassets/thumb.imageset/Contents.json rename to TGPControlsDemo/TGPControlsDemo/Assets.xcassets/thumb.imageset/Contents.json diff --git a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/thumb.imageset/wthumb.png b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/thumb.imageset/wthumb.png similarity index 100% rename from TGPControlsDemo/TGPControlsDemo/Images.xcassets/thumb.imageset/wthumb.png rename to TGPControlsDemo/TGPControlsDemo/Assets.xcassets/thumb.imageset/wthumb.png diff --git a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/tick.imageset/Contents.json b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/tick.imageset/Contents.json similarity index 100% rename from TGPControlsDemo/TGPControlsDemo/Images.xcassets/tick.imageset/Contents.json rename to TGPControlsDemo/TGPControlsDemo/Assets.xcassets/tick.imageset/Contents.json diff --git a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/tick.imageset/wtick.png b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/tick.imageset/wtick.png similarity index 100% rename from TGPControlsDemo/TGPControlsDemo/Images.xcassets/tick.imageset/wtick.png rename to TGPControlsDemo/TGPControlsDemo/Assets.xcassets/tick.imageset/wtick.png diff --git a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/track.imageset/Contents.json b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/track.imageset/Contents.json similarity index 100% rename from TGPControlsDemo/TGPControlsDemo/Images.xcassets/track.imageset/Contents.json rename to TGPControlsDemo/TGPControlsDemo/Assets.xcassets/track.imageset/Contents.json diff --git a/TGPControlsDemo/TGPControlsDemo/Images.xcassets/track.imageset/wtrack.png b/TGPControlsDemo/TGPControlsDemo/Assets.xcassets/track.imageset/wtrack.png similarity index 100% rename from TGPControlsDemo/TGPControlsDemo/Images.xcassets/track.imageset/wtrack.png rename to TGPControlsDemo/TGPControlsDemo/Assets.xcassets/track.imageset/wtrack.png diff --git a/TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.storyboard b/TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.xib b/TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 4473af8..0000000 --- a/TGPControlsDemo/TGPControlsDemo/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard b/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard index a5bc4ce..988afa4 100644 --- a/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard +++ b/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard @@ -1,10 +1,14 @@ - - + + + + + - + + @@ -28,12 +32,12 @@ - + @@ -56,17 +60,17 @@ - + - + - - + + @@ -99,8 +103,8 @@ - - + + @@ -137,7 +141,7 @@ - + @@ -150,7 +154,7 @@ - + @@ -160,7 +164,7 @@ - + @@ -170,12 +174,12 @@ - + @@ -191,7 +195,7 @@ - + @@ -201,13 +205,13 @@ - + - + @@ -228,7 +232,7 @@ - + @@ -244,12 +248,12 @@ - + @@ -269,14 +273,14 @@ - + - + @@ -294,7 +298,7 @@ - + @@ -314,10 +318,10 @@ - + - + @@ -328,13 +332,13 @@ - - + + @@ -358,7 +362,7 @@ - + @@ -371,7 +375,7 @@ @@ -382,7 +386,7 @@ - + @@ -396,7 +400,7 @@ - + @@ -460,7 +464,7 @@ - + @@ -468,7 +472,6 @@ - diff --git a/TGPControlsDemo/TGPControlsDemo/Info.plist b/TGPControlsDemo/TGPControlsDemo/Info.plist index 40c6215..d052473 100644 --- a/TGPControlsDemo/TGPControlsDemo/Info.plist +++ b/TGPControlsDemo/TGPControlsDemo/Info.plist @@ -16,8 +16,6 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/TGPControlsDemo/TGPControlsDemo/ViewController.swift b/TGPControlsDemo/TGPControlsDemo/ViewController.swift index 349679d..4ce5f6e 100644 --- a/TGPControlsDemo/TGPControlsDemo/ViewController.swift +++ b/TGPControlsDemo/TGPControlsDemo/ViewController.swift @@ -1,14 +1,4 @@ -// @file: ViewController.swift -// @project: TGPControlsDemo (TGPControls) -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott +// Copyright (c) 2017, Xavier Schott // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -29,99 +19,98 @@ // THE SOFTWARE. import UIKit -import TGPControls class ViewController: UIViewController { @IBOutlet weak var oneTo10Labels: TGPCamelLabels! @IBOutlet weak var oneTo10Slider: TGPDiscreteSlider! - + @IBOutlet weak var alphabetLabels: TGPCamelLabels! @IBOutlet weak var alphabetSlider: TGPDiscreteSlider! - + @IBOutlet var pictureLabels: TGPCamelLabels! @IBOutlet var pictureSlider: TGPDiscreteSlider! @IBOutlet weak var switch1Camel: TGPCamelLabels! @IBOutlet weak var switch2Camel: TGPCamelLabels! - + @IBOutlet weak var controlEventsLabel: UILabel! @IBOutlet weak var dualColorSlider: TGPDiscreteSlider! @IBOutlet weak var stepper: UIStepper! override func viewDidLoad() { super.viewDidLoad() - + self.alphabetLabels.names = ["A","B","C","D","E","F", "G","H","I","J","K","L","M", - "N","O","P","Q","R","S", "T","U","V","W","X","Y","Z"] + "N","O","P","Q","R","S", "T","U","V","W","X","Y","Z"] self.pictureLabels.names = ["orient", "occident", "zénith", "nadir", "septentrion", "midi"] self.switch1Camel.names = ["OFF", "ON"] self.switch2Camel.names = ["O", "l"] - + // Automatically track tick spacing changes and UIControlEventValueChanged self.alphabetSlider.ticksListener = self.alphabetLabels self.oneTo10Slider.ticksListener = self.oneTo10Labels self.pictureSlider.ticksListener = self.pictureLabels // UIControlEvents - self.dualColorSlider.addTarget(self, action: "touchDown:event:", forControlEvents: .TouchDown) - self.dualColorSlider.addTarget(self, action: "touchDownRepeat:event:", forControlEvents: .TouchDownRepeat) - self.dualColorSlider.addTarget(self, action: "touchDragInside:event:", forControlEvents: .TouchDragInside) - self.dualColorSlider.addTarget(self, action: "touchDragOutside:event:", forControlEvents: .TouchDragOutside) - self.dualColorSlider.addTarget(self, action: "touchDragEnter:event:", forControlEvents: .TouchDragEnter) - self.dualColorSlider.addTarget(self, action: "touchDragExit:event:", forControlEvents: .TouchDragExit) - self.dualColorSlider.addTarget(self, action: "touchUpInside:event:", forControlEvents: .TouchUpInside) - self.dualColorSlider.addTarget(self, action: "touchUpOutside:event:", forControlEvents: .TouchUpOutside) - self.dualColorSlider.addTarget(self, action: "touchCancel:event:", forControlEvents: .TouchCancel) - self.dualColorSlider.addTarget(self, action: "valueChanged:event:", forControlEvents: .ValueChanged) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchDown(_:event:)), for: .touchDown) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchDownRepeat(_:event:)), for: .touchDownRepeat) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchDragInside(_:event:)), for: .touchDragInside) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchDragOutside(_:event:)), for: .touchDragOutside) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchDragEnter(_:event:)), for: .touchDragEnter) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchDragExit(_:event:)), for: .touchDragExit) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchUpInside(_:event:)), for: .touchUpInside) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchUpOutside(_:event:)), for: .touchUpOutside) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.touchCancel(_:event:)), for: .touchCancel) + self.dualColorSlider.addTarget(self, action: #selector(ViewController.valueChanged(_:event:)), for: .valueChanged) } // MARK: - UISwitch - - @IBAction func switch1ValueChanged(sender: UISwitch) { - self.switch1Camel.value = (sender.on) ? 1 : 0 + + @IBAction func switch1ValueChanged(_ sender: UISwitch) { + self.switch1Camel.value = (sender.isOn) ? 1 : 0 } - - @IBAction func switch2TouchUpInside(sender: UISwitch) { - self.switch2Camel.value = (sender.on) ? 1 : 0 + + @IBAction func switch2TouchUpInside(_ sender: UISwitch) { + self.switch2Camel.value = (sender.isOn) ? 1 : 0 } // MARK: - UIControlEvents - func touchDown(sender: UIControl, event:UIEvent) { + func touchDown(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchDown" } - func touchDownRepeat(sender: UIControl, event:UIEvent) { + func touchDownRepeat(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchDownRepeat" } - func touchDragInside(sender: UIControl, event:UIEvent) { + func touchDragInside(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchDragInside" } - func touchDragOutside(sender: UIControl, event:UIEvent) { + func touchDragOutside(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchDragOutside" } - func touchDragEnter(sender: UIControl, event:UIEvent) { + func touchDragEnter(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchDragEnter" } - func touchDragExit(sender: UIControl, event:UIEvent) { + func touchDragExit(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchDragExit" } - func touchUpInside(sender: UIControl, event:UIEvent) { + func touchUpInside(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchUpInside" } - func touchUpOutside(sender: UIControl, event:UIEvent) { + func touchUpOutside(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchUpOutside" } - func touchCancel(sender: UIControl, event:UIEvent) { + func touchCancel(_ sender: UIControl, event:UIEvent) { self.controlEventsLabel.text = "touchCancel" } - func valueChanged(sender: TGPDiscreteSlider, event:UIEvent) { + func valueChanged(_ sender: TGPDiscreteSlider, event:UIEvent) { self.controlEventsLabel.text = "valueChanged" self.stepper.value = Double(sender.value) } // MARK: - UIStepper - @IBAction func stepperValueChanged(sender: UIStepper) { + @IBAction func stepperValueChanged(_ sender: UIStepper) { self.dualColorSlider.value = CGFloat(sender.value) } } diff --git a/TGPControlsDemo/TGPControlsDemoTests/Info.plist b/TGPControlsDemo/TGPControlsDemoTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/TGPControlsDemo/TGPControlsDemoTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/TGPControlsDemo/TGPControlsDemoTests/TGPControlsDemoTests.swift b/TGPControlsDemo/TGPControlsDemoTests/TGPControlsDemoTests.swift deleted file mode 100644 index 4d3bff3..0000000 --- a/TGPControlsDemo/TGPControlsDemoTests/TGPControlsDemoTests.swift +++ /dev/null @@ -1,58 +0,0 @@ -// @file: TGPControlsDemoTests.swift -// @project: TGPControlsDemo (TGPControls) -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import UIKit -import XCTest - -class TGPControlsDemoTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - XCTAssert(true, "Pass") - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock() { - // Put the code you want to measure the time of here. - } - } - -} From 3236dff798e71c4aa3cde13878cf7eda4303ffdd Mon Sep 17 00:00:00 2001 From: Xavier Schott Date: Sat, 4 Feb 2017 21:01:29 -0800 Subject: [PATCH 2/5] Migrated to Swift 3 --- TGPControls.podspec | 31 +- TGPControls.xcodeproj/project.pbxproj | 321 +++----- .../contents.xcworkspacedata | 7 - {TGPControlsTests => TGPControls}/Info.plist | 12 +- TGPControls/TGPCamelLabels.swift | 342 ++++++++ .../TGPControls.h | 17 +- .../TGPControlsTicksProtocol.swift | 19 +- TGPControls/TGPDiscreteSlider.swift | 742 ++++++++++++++++++ TGPControlsDemo/Podfile | 9 +- .../TGPControlsDemo.xcodeproj/project.pbxproj | 49 +- .../Base.lproj/Main.storyboard | 24 +- .../TGPControlsDemo/ViewController.swift | 1 + TGPControlsDemo7/Podfile | 7 - .../project.pbxproj | 372 --------- .../TGPControlsDemo7/AppDelegate.m | 67 -- .../Base.lproj/LaunchScreen.xib | 41 - .../Base.lproj/Main.storyboard | 485 ------------ .../AppIcon.appiconset/Contents.json | 68 -- .../Images.xcassets/Contents.json | 6 - .../LaunchImage.launchimage/Contents.json | 53 -- .../LaunchImage.launchimage/Default-2x.png | Bin 31948 -> 0 bytes .../Default-Retina4.png | Bin 34979 -> 0 bytes .../thumb.imageset/Contents.json | 21 - .../Images.xcassets/thumb.imageset/wthumb.png | Bin 5601 -> 0 bytes .../tick.imageset/Contents.json | 21 - .../Images.xcassets/tick.imageset/wtick.png | Bin 5572 -> 0 bytes .../track.imageset/Contents.json | 21 - .../Images.xcassets/track.imageset/wtrack.png | Bin 5799 -> 0 bytes TGPControlsDemo7/TGPControlsDemo7/Info.plist | 47 -- .../TGPControlsDemo7/ViewController.m | 136 ---- TGPControlsDemo7/TGPControlsDemo7/main.m | 38 - TGPControls_License.txt | 4 +- 32 files changed, 1309 insertions(+), 1652 deletions(-) delete mode 100644 TGPControls.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename {TGPControlsTests => TGPControls}/Info.plist (75%) create mode 100644 TGPControls/TGPCamelLabels.swift rename TGPControlsDemo7/TGPControlsDemo7/AppDelegate.h => TGPControls/TGPControls.h (75%) rename TGPControlsDemo7/TGPControlsDemo7/ViewController.h => TGPControls/TGPControlsTicksProtocol.swift (82%) create mode 100644 TGPControls/TGPDiscreteSlider.swift delete mode 100644 TGPControlsDemo7/Podfile delete mode 100644 TGPControlsDemo7/TGPControlsDemo7.xcodeproj/project.pbxproj delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/AppDelegate.m delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Base.lproj/LaunchScreen.xib delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Base.lproj/Main.storyboard delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/Contents.json delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Contents.json delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Default-2x.png delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Default-Retina4.png delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/thumb.imageset/Contents.json delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/thumb.imageset/wthumb.png delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/tick.imageset/Contents.json delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/tick.imageset/wtick.png delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/track.imageset/Contents.json delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/track.imageset/wtrack.png delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/Info.plist delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/ViewController.m delete mode 100644 TGPControlsDemo7/TGPControlsDemo7/main.m diff --git a/TGPControls.podspec b/TGPControls.podspec index 8bbdb0e..dcc33fb 100644 --- a/TGPControls.podspec +++ b/TGPControls.podspec @@ -60,7 +60,9 @@ Pod::Spec.new do |s| # the deployment target. You can optionally include the target after the platform. # - s.platform = :ios, "9.3" + s.platform = :ios + s.ios.deployment_target = '8.0' + s.requires_arc = true # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # @@ -80,8 +82,33 @@ Pod::Spec.new do |s| # Not including the public_header_files will make all headers public. # - s.source_files = "TGPControls", "TGPControls/**/*.swift" + s.source_files = "TGPControls/**/*.{swift}" s.exclude_files = "TGPControlsDemo7/*", "TGPControlsDemo/*" + # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Link your library with frameworks, or libraries. Libraries do not include + # the lib prefix of their name. + # + + s.framework = "UIKit" + # s.framework = "SomeFramework" + # s.frameworks = "SomeFramework", "AnotherFramework" + + # s.library = "iconv" + # s.libraries = "iconv", "xml2" + + + # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # If your library depends on compiler flags you can set them in the xcconfig hash + # where they will only apply to your library. If you depend on other Podspecs + # you can include multiple dependencies to ensure it works. + + # s.requires_arc = true + + # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } + # s.dependency "JSONKit", "~> 1.4" + end diff --git a/TGPControls.xcodeproj/project.pbxproj b/TGPControls.xcodeproj/project.pbxproj index 72835c9..3656d1d 100644 --- a/TGPControls.xcodeproj/project.pbxproj +++ b/TGPControls.xcodeproj/project.pbxproj @@ -7,129 +7,82 @@ objects = { /* Begin PBXBuildFile section */ - DC101D661A75749600ECCF80 /* libTGPControls.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DC101D5A1A75749600ECCF80 /* libTGPControls.a */; }; + DC56BE021E46EA2000AAD0D9 /* TGPControls.h in Headers */ = {isa = PBXBuildFile; fileRef = DC56BE001E46EA2000AAD0D9 /* TGPControls.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC88CC4E1E46EAD10076AC65 /* TGPCamelLabels.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC88CC4B1E46EAD10076AC65 /* TGPCamelLabels.swift */; }; + DC88CC4F1E46EAD10076AC65 /* TGPControlsTicksProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC88CC4C1E46EAD10076AC65 /* TGPControlsTicksProtocol.swift */; }; + DC88CC501E46EAD10076AC65 /* TGPDiscreteSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC88CC4D1E46EAD10076AC65 /* TGPDiscreteSlider.swift */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - DC101D671A75749600ECCF80 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DC101D521A75749600ECCF80 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DC101D591A75749600ECCF80; - remoteInfo = TGPControls; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - DC101D581A75749600ECCF80 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ - DC0468DF1A75962E0084DE3E /* TGPCamelLabels7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGPCamelLabels7.h; sourceTree = ""; }; - DC0468E01A75962E0084DE3E /* TGPCamelLabels7.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGPCamelLabels7.m; sourceTree = ""; }; - DC0468E11A75962E0084DE3E /* TGPDiscreteSlider7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGPDiscreteSlider7.h; sourceTree = ""; }; - DC0468E21A75962E0084DE3E /* TGPDiscreteSlider7.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGPDiscreteSlider7.m; sourceTree = ""; }; - DC0468E51A7596690084DE3E /* TGPCamelLabels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGPCamelLabels.h; sourceTree = ""; }; - DC0468E61A7596690084DE3E /* TGPCamelLabels.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGPCamelLabels.m; sourceTree = ""; }; - DC0468E81A7596930084DE3E /* TGPDiscreteSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGPDiscreteSlider.h; sourceTree = ""; }; - DC0468E91A7596930084DE3E /* TGPDiscreteSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGPDiscreteSlider.m; sourceTree = ""; }; - DC101D5A1A75749600ECCF80 /* libTGPControls.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libTGPControls.a; sourceTree = BUILT_PRODUCTS_DIR; }; - DC101D651A75749600ECCF80 /* TGPControlsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TGPControlsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - DC101D6B1A75749600ECCF80 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DC101D7A1A75756300ECCF80 /* TGPControls_License.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = TGPControls_License.txt; sourceTree = ""; }; - DC101D7B1A75756300ECCF80 /* TGPControls.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = TGPControls.podspec; sourceTree = ""; }; - DC28A54D1A947704003C9405 /* TGPControlsTicksProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGPControlsTicksProtocol.h; sourceTree = ""; }; + DC56BDFD1E46EA2000AAD0D9 /* TGPControls.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TGPControls.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DC56BE001E46EA2000AAD0D9 /* TGPControls.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TGPControls.h; sourceTree = ""; }; + DC56BE011E46EA2000AAD0D9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DC88CC4B1E46EAD10076AC65 /* TGPCamelLabels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TGPCamelLabels.swift; sourceTree = ""; }; + DC88CC4C1E46EAD10076AC65 /* TGPControlsTicksProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TGPControlsTicksProtocol.swift; sourceTree = ""; }; + DC88CC4D1E46EAD10076AC65 /* TGPDiscreteSlider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TGPDiscreteSlider.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - DC101D571A75749600ECCF80 /* Frameworks */ = { + DC56BDF91E46EA2000AAD0D9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - DC101D621A75749600ECCF80 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DC101D661A75749600ECCF80 /* libTGPControls.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - DC0468DE1A75962E0084DE3E /* TGPControls */ = { + DC56BDF31E46EA2000AAD0D9 = { isa = PBXGroup; children = ( - DC0468E51A7596690084DE3E /* TGPCamelLabels.h */, - DC0468E61A7596690084DE3E /* TGPCamelLabels.m */, - DC28A54D1A947704003C9405 /* TGPControlsTicksProtocol.h */, - DC0468E81A7596930084DE3E /* TGPDiscreteSlider.h */, - DC0468E91A7596930084DE3E /* TGPDiscreteSlider.m */, - DC0468DF1A75962E0084DE3E /* TGPCamelLabels7.h */, - DC0468E01A75962E0084DE3E /* TGPCamelLabels7.m */, - DC0468E11A75962E0084DE3E /* TGPDiscreteSlider7.h */, - DC0468E21A75962E0084DE3E /* TGPDiscreteSlider7.m */, - ); - path = TGPControls; - sourceTree = ""; - }; - DC101D511A75749600ECCF80 = { - isa = PBXGroup; - children = ( - DC101D7A1A75756300ECCF80 /* TGPControls_License.txt */, - DC101D7B1A75756300ECCF80 /* TGPControls.podspec */, - DC0468DE1A75962E0084DE3E /* TGPControls */, - DC101D691A75749600ECCF80 /* TGPControlsTests */, - DC101D5B1A75749600ECCF80 /* Products */, + DC56BDFF1E46EA2000AAD0D9 /* TGPControls */, + DC56BDFE1E46EA2000AAD0D9 /* Products */, ); sourceTree = ""; }; - DC101D5B1A75749600ECCF80 /* Products */ = { + DC56BDFE1E46EA2000AAD0D9 /* Products */ = { isa = PBXGroup; children = ( - DC101D5A1A75749600ECCF80 /* libTGPControls.a */, - DC101D651A75749600ECCF80 /* TGPControlsTests.xctest */, + DC56BDFD1E46EA2000AAD0D9 /* TGPControls.framework */, ); name = Products; sourceTree = ""; }; - DC101D691A75749600ECCF80 /* TGPControlsTests */ = { + DC56BDFF1E46EA2000AAD0D9 /* TGPControls */ = { isa = PBXGroup; children = ( - DC101D6A1A75749600ECCF80 /* Supporting Files */, + DC56BE001E46EA2000AAD0D9 /* TGPControls.h */, + DC88CC4B1E46EAD10076AC65 /* TGPCamelLabels.swift */, + DC88CC4C1E46EAD10076AC65 /* TGPControlsTicksProtocol.swift */, + DC88CC4D1E46EAD10076AC65 /* TGPDiscreteSlider.swift */, + DC56BE011E46EA2000AAD0D9 /* Info.plist */, ); - path = TGPControlsTests; - sourceTree = ""; - }; - DC101D6A1A75749600ECCF80 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DC101D6B1A75749600ECCF80 /* Info.plist */, - ); - name = "Supporting Files"; + path = TGPControls; sourceTree = ""; }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + DC56BDFA1E46EA2000AAD0D9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + DC56BE021E46EA2000AAD0D9 /* TGPControls.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ - DC101D591A75749600ECCF80 /* TGPControls */ = { + DC56BDFC1E46EA2000AAD0D9 /* TGPControls */ = { isa = PBXNativeTarget; - buildConfigurationList = DC101D6E1A75749600ECCF80 /* Build configuration list for PBXNativeTarget "TGPControls" */; + buildConfigurationList = DC56BE051E46EA2000AAD0D9 /* Build configuration list for PBXNativeTarget "TGPControls" */; buildPhases = ( - DC101D561A75749600ECCF80 /* Sources */, - DC101D571A75749600ECCF80 /* Frameworks */, - DC101D581A75749600ECCF80 /* CopyFiles */, + DC56BDF81E46EA2000AAD0D9 /* Sources */, + DC56BDF91E46EA2000AAD0D9 /* Frameworks */, + DC56BDFA1E46EA2000AAD0D9 /* Headers */, + DC56BDFB1E46EA2000AAD0D9 /* Resources */, ); buildRules = ( ); @@ -137,64 +90,45 @@ ); name = TGPControls; productName = TGPControls; - productReference = DC101D5A1A75749600ECCF80 /* libTGPControls.a */; - productType = "com.apple.product-type.library.static"; - }; - DC101D641A75749600ECCF80 /* TGPControlsTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DC101D711A75749600ECCF80 /* Build configuration list for PBXNativeTarget "TGPControlsTests" */; - buildPhases = ( - DC101D611A75749600ECCF80 /* Sources */, - DC101D621A75749600ECCF80 /* Frameworks */, - DC101D631A75749600ECCF80 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DC101D681A75749600ECCF80 /* PBXTargetDependency */, - ); - name = TGPControlsTests; - productName = TGPControlsTests; - productReference = DC101D651A75749600ECCF80 /* TGPControlsTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; + productReference = DC56BDFD1E46EA2000AAD0D9 /* TGPControls.framework */; + productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - DC101D521A75749600ECCF80 /* Project object */ = { + DC56BDF41E46EA2000AAD0D9 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0610; - ORGANIZATIONNAME = arquebuse; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = SwiftArchitect; TargetAttributes = { - DC101D591A75749600ECCF80 = { - CreatedOnToolsVersion = 6.1.1; - }; - DC101D641A75749600ECCF80 = { - CreatedOnToolsVersion = 6.1.1; + DC56BDFC1E46EA2000AAD0D9 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = 55K7THBUV8; + LastSwiftMigration = 0820; + ProvisioningStyle = Automatic; }; }; }; - buildConfigurationList = DC101D551A75749600ECCF80 /* Build configuration list for PBXProject "TGPControls" */; + buildConfigurationList = DC56BDF71E46EA2000AAD0D9 /* Build configuration list for PBXProject "TGPControls" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); - mainGroup = DC101D511A75749600ECCF80; - productRefGroup = DC101D5B1A75749600ECCF80 /* Products */; + mainGroup = DC56BDF31E46EA2000AAD0D9; + productRefGroup = DC56BDFE1E46EA2000AAD0D9 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - DC101D591A75749600ECCF80 /* TGPControls */, - DC101D641A75749600ECCF80 /* TGPControlsTests */, + DC56BDFC1E46EA2000AAD0D9 /* TGPControls */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - DC101D631A75749600ECCF80 /* Resources */ = { + DC56BDFB1E46EA2000AAD0D9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -204,35 +138,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - DC101D561A75749600ECCF80 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DC101D611A75749600ECCF80 /* Sources */ = { + DC56BDF81E46EA2000AAD0D9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + DC88CC501E46EAD10076AC65 /* TGPDiscreteSlider.swift in Sources */, + DC88CC4F1E46EAD10076AC65 /* TGPControlsTicksProtocol.swift in Sources */, + DC88CC4E1E46EAD10076AC65 /* TGPCamelLabels.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - DC101D681A75749600ECCF80 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DC101D591A75749600ECCF80 /* TGPControls */; - targetProxy = DC101D671A75749600ECCF80 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ - DC101D6C1A75749600ECCF80 /* Debug */ = { + DC56BE031E46EA2000AAD0D9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -240,39 +163,52 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - DC101D6D1A75749600ECCF80 /* Release */ = { + DC56BE041E46EA2000AAD0D9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -280,110 +216,105 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Release; }; - DC101D6F1A75749600ECCF80 /* Debug */ = { + DC56BE061E46EA2000AAD0D9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = "-ObjC"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 55K7THBUV8; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = TGPControls/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.swiftarchitect.TGPControls; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; - DC101D701A75749600ECCF80 /* Release */ = { + DC56BE071E46EA2000AAD0D9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = "-ObjC"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 55K7THBUV8; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = TGPControls/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.swiftarchitect.TGPControls; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - }; - name = Release; - }; - DC101D721A75749600ECCF80 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = TGPControlsTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - DC101D731A75749600ECCF80 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = TGPControlsTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - DC101D551A75749600ECCF80 /* Build configuration list for PBXProject "TGPControls" */ = { + DC56BDF71E46EA2000AAD0D9 /* Build configuration list for PBXProject "TGPControls" */ = { isa = XCConfigurationList; buildConfigurations = ( - DC101D6C1A75749600ECCF80 /* Debug */, - DC101D6D1A75749600ECCF80 /* Release */, + DC56BE031E46EA2000AAD0D9 /* Debug */, + DC56BE041E46EA2000AAD0D9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DC101D6E1A75749600ECCF80 /* Build configuration list for PBXNativeTarget "TGPControls" */ = { + DC56BE051E46EA2000AAD0D9 /* Build configuration list for PBXNativeTarget "TGPControls" */ = { isa = XCConfigurationList; buildConfigurations = ( - DC101D6F1A75749600ECCF80 /* Debug */, - DC101D701A75749600ECCF80 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DC101D711A75749600ECCF80 /* Build configuration list for PBXNativeTarget "TGPControlsTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC101D721A75749600ECCF80 /* Debug */, - DC101D731A75749600ECCF80 /* Release */, + DC56BE061E46EA2000AAD0D9 /* Debug */, + DC56BE071E46EA2000AAD0D9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = DC101D521A75749600ECCF80 /* Project object */; + rootObject = DC56BDF41E46EA2000AAD0D9 /* Project object */; } diff --git a/TGPControls.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TGPControls.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 535f81b..0000000 --- a/TGPControls.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/TGPControlsTests/Info.plist b/TGPControls/Info.plist similarity index 75% rename from TGPControlsTests/Info.plist rename to TGPControls/Info.plist index f794cd2..1c6f0bd 100644 --- a/TGPControlsTests/Info.plist +++ b/TGPControls/Info.plist @@ -7,18 +7,18 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.thegothicparty.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType - BNDL + FMWK CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? + 3.0 CFBundleVersion - 1 + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + diff --git a/TGPControls/TGPCamelLabels.swift b/TGPControls/TGPCamelLabels.swift new file mode 100644 index 0000000..3276e37 --- /dev/null +++ b/TGPControls/TGPCamelLabels.swift @@ -0,0 +1,342 @@ +// @file: TGPCamelLabels.swift +// @project: TGPControls +// +// @author: Xavier Schott +// mailto://xschott@gmail.com +// http://thegothicparty.com +// tel://+18089383634 +// +// @license: http://opensource.org/licenses/MIT +// Copyright (c) 2017, Xavier Schott +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import UIKit + +@IBDesignable +public class TGPCamelLabels: UIControl { + + // Only used if labels.count < 1 + @IBInspectable public var tickCount:Int { + get { + return names.count + } + set { + // Put some order to tickCount: 1 >= count >= 128 + let count = max(1, min(newValue, 128)) + debugNames(count: count) + layoutTrack() + } + } + + @IBInspectable public var ticksDistance:CGFloat = 44.0 { + didSet { + ticksDistance = max(0, ticksDistance) + layoutTrack() + } + } + + @IBInspectable public var value:UInt = 0 { + didSet { + dockEffect(duration: animationDuration) + } + } + + @IBInspectable public var upFontName:String? = nil { + didSet { + layoutTrack() + } + } + + @IBInspectable public var upFontSize:CGFloat = 12 { + didSet { + layoutTrack() + } + } + + @IBInspectable public var upFontColor:UIColor? = nil { + didSet { + layoutTrack() + } + } + + @IBInspectable public var downFontName:String? = nil { + didSet { + layoutTrack() + } + } + + @IBInspectable public var downFontSize:CGFloat = 12 { + didSet { + layoutTrack() + } + } + + @IBInspectable public var downFontColor:UIColor? = nil { + didSet { + layoutTrack() + } + } + + // Label off-center to the left and right of the slider + // expressed in label width. 0: none, -1/2: half outside, 1/2; half inside + @IBInspectable public var offCenter:CGFloat = 0 { + didSet { + layoutTrack() + } + } + + // Label margins to the left and right of the slider + @IBInspectable public var insets:NSInteger = 0 { + didSet { + layoutTrack() + } + } + + public var names:[String] = [] { // Will dictate the number of ticks + didSet { + assert(names.count > 0) + layoutTrack() + } + } + + // When bounds change, recalculate layout + override public var bounds: CGRect { + didSet { + layoutTrack() + setNeedsDisplay() + } + } + + public var animationDuration:TimeInterval = 0.15 + + // Fishy + var animate = true + + // Private + var lastValue = NSNotFound + var upLabels:[UILabel] = [] + var dnLabels:[UILabel] = [] + + // MARK: UIView + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + initProperties() + } + + override init(frame: CGRect) { + super.init(frame: frame) + initProperties() + } + + // clickthrough + public override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + for view in subviews { + if !view.isHidden && + view.alpha > 0.0 && + view.isUserInteractionEnabled && + view.point(inside: convert(point, to: view), with: event) { + return true + } + } + return false + } + + // MARK: TGPCamelLabels + + func initProperties() { + debugNames(count: 10) + layoutTrack() + } + + func debugNames(count:Int) { + // Dynamic property, will create an array with labels, generally for debugging purposes + var array:[String] = [] + for iterate in 1...count { + array.append("\(iterate)") + } + names = array + } + + func layoutTrack() { + + func insetLabel(_ label:UILabel?, withInset inset:NSInteger, andMultiplier multiplier:CGFloat) { + assert(label != nil) + if let label = label { + label.frame = { + var frame = label.frame + frame.origin.x += frame.size.width * multiplier + frame.origin.x += CGFloat(inset) + return frame + }() + } + } + + for label in upLabels { + label.removeFromSuperview() + } + upLabels = [] + for label in dnLabels { + label.removeFromSuperview() + } + dnLabels = [] + + let count = names.count + if count > 0 { + var centerX = (bounds.width - (CGFloat(count - 1) * ticksDistance))/2.0 + let centerY = bounds.height / 2.0 + for name in names { + let upLabel = UILabel.init() + upLabels.append(upLabel) + upLabel.text = name + if let upFontName = upFontName { + upLabel.font = UIFont.init(name: upFontName, size: upFontSize) + } else { + upLabel.font = UIFont.boldSystemFont(ofSize: upFontSize) + } + if let textColor = upFontColor ?? tintColor { + upLabel.textColor = textColor + } + upLabel.sizeToFit() + upLabel.center = CGPoint(x: centerX, y: centerY) + + upLabel.frame = { + var frame = upLabel.frame + frame.origin.y = bounds.height - frame.height + return frame + }() + + upLabel.alpha = 0.0 + addSubview(upLabel) + + let dnLabel = UILabel.init() + dnLabels.append(dnLabel) + dnLabel.text = name + if let downFontName = downFontName { + dnLabel.font = UIFont.init(name:downFontName, size:downFontSize) + } else { + dnLabel.font = UIFont.boldSystemFont(ofSize: downFontSize) + } + dnLabel.textColor = downFontColor ?? UIColor.gray + dnLabel.sizeToFit() + dnLabel.center = CGPoint(x:centerX, y:centerY) + dnLabel.frame = { + var frame = dnLabel.frame + frame.origin.y = bounds.height - frame.height + return frame + }() + addSubview(dnLabel) + + centerX += ticksDistance + } + + // Fix left and right label, if there are at least 2 labels + if names.count > 1 { + insetLabel(upLabels.first, withInset: insets, andMultiplier: offCenter) + insetLabel(upLabels.last, withInset: -insets, andMultiplier: -offCenter) + insetLabel(dnLabels.first, withInset: insets, andMultiplier: offCenter) + insetLabel(dnLabels.last, withInset: -insets, andMultiplier: -offCenter) + } + + dockEffect(duration:0.0) + } + } + + + func dockEffect(duration:TimeInterval) + { + let up = Int(value) + + // Unlike the National Parks from which it is inspired, this Dock Effect + // does not abruptly change from BOLD to plain. Instead, we have 2 sets of + // labels, which are faded back and forth, in unisson. + // - BOLD to plain + // - Black to gray + // - high to low + // Each animation picks up where the previous left off + let moveBlock:() -> Void = { + let x = self.upLabels + // Bring almost all down + for (idx, label) in self.upLabels.enumerated() { + if up != idx { + self.moveDown(aView: label, withAlpha: 0) + } + } + for (idx, label) in self.dnLabels.enumerated() { + if up != idx { + self.moveDown(aView: label, withAlpha: 1) + } + } + + // Bring the selection up + if up < self.upLabels.count { + self.moveUp(aView: self.upLabels[up], withAlpha:1) + } + if up < self.dnLabels.count { + self.moveUp(aView: self.dnLabels[up], withAlpha:0) + } + } + + if duration > 0 { + UIView.animate(withDuration: duration, + delay: 0, + options: [.beginFromCurrentState, .curveLinear], + animations: moveBlock, + completion: nil) + } else { + moveBlock() + } + } + + func moveDown(aView:UIView, withAlpha alpha:CGFloat) + { + if animate { + aView.frame = { + var frame = aView.frame + frame.origin.y = bounds.height - frame.height + return frame + }() + } + aView.alpha = alpha + } + + func moveUp(aView:UIView, withAlpha alpha:CGFloat) + { + if animate { + aView.frame = { + var frame = aView.frame + frame.origin.y = 0 + return frame + }() + } + aView.alpha = alpha + } + +} + +extension TGPCamelLabels : TGPControlsTicksProtocol { + public func tgpTicksDistanceChanged(ticksDistance: CGFloat, sender: AnyObject) { + self.ticksDistance = ticksDistance + } + + public func tgpValueChanged(value: UInt) { + self.value = value + } +} diff --git a/TGPControlsDemo7/TGPControlsDemo7/AppDelegate.h b/TGPControls/TGPControls.h similarity index 75% rename from TGPControlsDemo7/TGPControlsDemo7/AppDelegate.h rename to TGPControls/TGPControls.h index 223af7a..98aa9ae 100644 --- a/TGPControlsDemo7/TGPControlsDemo7/AppDelegate.h +++ b/TGPControls/TGPControls.h @@ -1,14 +1,13 @@ -// @file: AppDelegate.h -// @project: TGPControlsDemo7 (TGPControls) +// @file: TGPControls.h +// @project: TGPControls // -// @history: Created November 27, 2014 (Thanksgiving Day) // @author: Xavier Schott // mailto://xschott@gmail.com // http://thegothicparty.com // tel://+18089383634 // // @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott +// Copyright (c) 2017, Xavier Schott // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -30,10 +29,12 @@ #import -@interface AppDelegate : UIResponder +//! Project version number for TGPControls. +FOUNDATION_EXPORT double TGPControlsVersionNumber; -@property (strong, nonatomic) UIWindow *window; +//! Project version string for TGPControls. +FOUNDATION_EXPORT const unsigned char TGPControlsVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import -@end - diff --git a/TGPControlsDemo7/TGPControlsDemo7/ViewController.h b/TGPControls/TGPControlsTicksProtocol.swift similarity index 82% rename from TGPControlsDemo7/TGPControlsDemo7/ViewController.h rename to TGPControls/TGPControlsTicksProtocol.swift index abc9321..6805ef7 100644 --- a/TGPControlsDemo7/TGPControlsDemo7/ViewController.h +++ b/TGPControls/TGPControlsTicksProtocol.swift @@ -1,14 +1,13 @@ -// @file: ViewController.h -// @project: TGPControlsDemo7 (TGPControls) +// @file: TGPControlsTicksProtocol.swift +// @project: TGPControls // -// @history: Created November 27, 2014 (Thanksgiving Day) // @author: Xavier Schott // mailto://xschott@gmail.com // http://thegothicparty.com // tel://+18089383634 // // @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott +// Copyright (c) 2017, Xavier Schott // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -28,10 +27,10 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -#import - -@interface ViewController : UIViewController - - -@end +import Foundation +public protocol TGPControlsTicksProtocol +{ + func tgpTicksDistanceChanged(ticksDistance:CGFloat, sender:AnyObject) + func tgpValueChanged(value:UInt) +} diff --git a/TGPControls/TGPDiscreteSlider.swift b/TGPControls/TGPDiscreteSlider.swift new file mode 100644 index 0000000..f0f0a20 --- /dev/null +++ b/TGPControls/TGPDiscreteSlider.swift @@ -0,0 +1,742 @@ +// @file: TGPDiscreteSlider.swift +// @project: TGPControls +// +// @author: Xavier Schott +// mailto://xschott@gmail.com +// http://thegothicparty.com +// tel://+18089383634 +// +// @license: http://opensource.org/licenses/MIT +// Copyright (c) 2017, Xavier Schott +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import UIKit + +public enum ComponentStyle:Int { + case iOS = 0 + case rectangular + case rounded + case invisible + case image +} + + +// Interface builder hides the IBInspectable for UIControl +#if TARGET_INTERFACE_BUILDER +public class TGPSlider_INTERFACE_BUILDER:UIView { + } +#else // !TARGET_INTERFACE_BUILDER + public class TGPSlider_INTERFACE_BUILDER:UIControl { + } +#endif // TARGET_INTERFACE_BUILDER + +@IBDesignable +public class TGPDiscreteSlider:TGPSlider_INTERFACE_BUILDER { + + @IBInspectable public var tickStyle:Int = ComponentStyle.rectangular.rawValue { + didSet { + layoutTrack() + } + } + + @IBInspectable public var tickSize:CGSize = CGSize(width:1, height:4) { + didSet { + tickSize.width = max(0, tickSize.width) + tickSize.height = max(0, tickSize.height) + layoutTrack() + } + } + + @IBInspectable public var tickCount:Int = 11 { + didSet { + tickCount = max(2, tickCount) + layoutTrack() + } + } + + @IBInspectable public var tickImage:String? = nil { + didSet { + layoutTrack() + } + } + + @IBInspectable public var trackStyle:Int = ComponentStyle.iOS.rawValue { + didSet { + layoutTrack() + } + } + + @IBInspectable public var trackThickness:CGFloat = 2 { + didSet { + trackThickness = max(0, trackThickness) + layoutTrack() + } + } + + @IBInspectable public var trackImage:String? = nil { + didSet { + layoutTrack() + } + } + + @IBInspectable public var minimumTrackTintColor:UIColor? = nil { + didSet { + layoutTrack() + } + } + + @IBInspectable public var maximumTrackTintColor:UIColor = UIColor(white: 0.71, alpha: 1) { + didSet { + layoutTrack() + } + } + + @IBInspectable public var thumbStyle:Int = ComponentStyle.iOS.rawValue { + didSet { + layoutTrack() + } + } + + @IBInspectable public var thumbSize:CGSize = CGSize(width:10, height:10) { + didSet { + thumbSize.width = max(1, thumbSize.width) + thumbSize.height = max(1, thumbSize.height) + layoutTrack() + } + } + + @IBInspectable public var thumbTintColor:UIColor? = nil { + didSet { + layoutTrack() + } + } + + @IBInspectable public var thumbImage:String? = nil { + didSet { + // Associate image to layer NSBundle.bundleForClass(class) + if let imageName = thumbImage, + let image = UIImage(named: imageName) { + thumbLayer.contents = image.cgImage + } + + layoutTrack() + } + } + + @IBInspectable public var thumbShadowRadius:CGFloat = 0 { + didSet { + layoutTrack() + } + } + + @IBInspectable public var thumbShadowOffset:CGSize = CGSize.zero { + didSet { + layoutTrack() + } + } + + @IBInspectable public var incrementValue:Int = 1 { + didSet { + if(0 == incrementValue) { + incrementValue = 1; // nonZeroIncrement + } + layoutTrack() + } + } + + // MARK: UISlider substitution + // AKA: UISlider value (as CGFloat for compatibility with UISlider API, but expected to contain integers) + + @IBInspectable public var minimumValue:CGFloat { + get { + return CGFloat(intMinimumValue) + } + set { + intMinimumValue = Int(newValue) + layoutTrack() + } + } + + @IBInspectable public var value:CGFloat { + get { + return CGFloat(intValue) + } + set { + intValue = Int(newValue) + layoutTrack() + } + } + + // MARK: @IBInspectable adapters + + public var tickComponentStyle:ComponentStyle { + get { + return ComponentStyle(rawValue: tickStyle) ?? .rectangular + } + set { + tickStyle = newValue.rawValue + } + } + + public var trackComponentStyle:ComponentStyle { + get { + return ComponentStyle(rawValue: trackStyle) ?? .iOS + } + set { + trackStyle = newValue.rawValue + } + } + + public var thumbComponentStyle:ComponentStyle { + get { + return ComponentStyle(rawValue: thumbStyle) ?? .iOS + } + set { + thumbStyle = newValue.rawValue + } + } + + // MARK: Properties + + public override var tintColor: UIColor! { + didSet { + layoutTrack() + } + } + + public override var bounds: CGRect { + didSet { + layoutTrack() + } + } + + public var ticksDistance:CGFloat { + get { + assert(tickCount > 1, "2 ticks minimum \(tickCount)") + let segments = CGFloat(max(1, self.tickCount - 1)) + return trackRectangle.width / segments + } + set {} + } + + public var ticksListener:TGPControlsTicksProtocol? = nil { + didSet { + ticksListener?.tgpTicksDistanceChanged(ticksDistance: ticksDistance, + sender: self) + } + } + + var intValue:Int = 0 + var intMinimumValue = -5 + + var ticksAbscisses:[CGPoint] = [] + var thumbAbscisse:CGFloat = 0 + var thumbLayer = CALayer() + var leftTrackLayer = CALayer() + var rightTrackLayer = CALayer() + var trackLayer = CALayer() + var ticksLayer = CALayer() + var trackRectangle = CGRect.zero + var touchedInside = false + + let iOSThumbShadowRadius:CGFloat = 4 + let iOSThumbShadowOffset = CGSize(width:0, height:3) + + // MARK: UIControl + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + initProperties() + } + + override init(frame: CGRect) { + super.init(frame: frame) + initProperties() + } + + public override func draw(_ rect: CGRect) { + drawTrack() + drawTicks() + drawThumb() + } + + func sendActionsForControlEvents() { + // Automatic UIControlEventValueChanged notification + if let ticksListener = ticksListener { + ticksListener.tgpValueChanged(value: UInt(value)) + } + } + + // MARK: TGPDiscreteSlider + + func initProperties() { + // Track is a clear clipping layer, and left + right sublayers, which brings in free animation + trackLayer.masksToBounds = true + trackLayer.backgroundColor = UIColor.clear.cgColor + layer.addSublayer(trackLayer) + if let backgroundColor = tintColor { + leftTrackLayer.backgroundColor = backgroundColor.cgColor + } + trackLayer.addSublayer(leftTrackLayer) + rightTrackLayer.backgroundColor = maximumTrackTintColor.cgColor + trackLayer.addSublayer(rightTrackLayer) + + // Ticks in between track and thumb + layer.addSublayer(ticksLayer) + + // The thumb is its own CALayer, which brings in free animation + layer.addSublayer(thumbLayer) + + isMultipleTouchEnabled = false + layoutTrack() + } + + func drawTicks() { + ticksLayer.frame = bounds + if let backgroundColor = tintColor { + ticksLayer.backgroundColor = backgroundColor.cgColor + } + + let path = UIBezierPath() + + switch tickComponentStyle { + case .rounded: + fallthrough + + case .rectangular: + fallthrough + + case .image: + for originPoint in ticksAbscisses { + let rectangle = CGRect(x: originPoint.x-(tickSize.width/2), + y: originPoint.y-(tickSize.height/2), + width: tickSize.width, + height: tickSize.height) + switch tickComponentStyle { + case .rounded: + path.append(UIBezierPath(roundedRect: rectangle, + cornerRadius: rectangle.height/2)) + + case .rectangular: + path.append(UIBezierPath(rect: rectangle)) + + case .image: + // Draw image if exists + if let tickImage = tickImage, + let image = UIImage(named: tickImage), + let cgImage = image.cgImage, + let ctx = UIGraphicsGetCurrentContext() { + let centered = CGRect(x: rectangle.origin.x + (rectangle.width/2) - (image.size.width/2), + y: rectangle.origin.y + (rectangle.height/2) - (image.size.height/2), + width: image.size.width, + height: image.size.height) + ctx.draw(cgImage, in: centered) + } + + case .invisible: + fallthrough + + case .iOS: + fallthrough + + default: + assert(false) + break + } + } + + case .invisible: + fallthrough + + case .iOS: + fallthrough + + default: + // Nothing to draw + break + } + + let maskLayer = CAShapeLayer() + maskLayer.frame = trackLayer.bounds + maskLayer.path = path.cgPath + ticksLayer.mask = maskLayer + } + + func drawTrack() { + switch(trackComponentStyle) { + case .rectangular: + trackLayer.frame = trackRectangle + trackLayer.cornerRadius = 0.0 + + case .invisible: + trackLayer.frame = CGRect.zero + + case .image: + trackLayer.frame = CGRect.zero + + // Draw image if exists + if let trackImage = trackImage, + let image = UIImage(named: trackImage), + let cgImage = image.cgImage, + let ctx = UIGraphicsGetCurrentContext() { + let centered = CGRect(x: (frame.width/2) - (image.size.width/2), + y: (frame.height/2) - (image.size.height/2), + width: image.size.width, + height: image.size.height) + ctx.draw(cgImage, in: centered) + } + + case .rounded: + fallthrough + + case .iOS: + fallthrough + + default: + trackLayer.frame = trackRectangle + trackLayer.cornerRadius = trackRectangle.height/2 + break + } + + leftTrackLayer.frame = { + var frame = trackLayer.bounds + frame.size.width = thumbAbscisse - trackRectangle.minX + return frame + }() + + if let backgroundColor = minimumTrackTintColor ?? tintColor { + leftTrackLayer.backgroundColor = backgroundColor.cgColor + } + + rightTrackLayer.frame = { + var frame = trackLayer.bounds + frame.size.width = trackRectangle.width - leftTrackLayer.frame.width + frame.origin.x = leftTrackLayer.frame.maxX + return frame + }() + rightTrackLayer.backgroundColor = maximumTrackTintColor.cgColor + } + + func drawThumb() { + if( value >= minimumValue) { // Feature: hide the thumb when below range + + let thumbSizeForStyle = thumbSizeIncludingShadow() + let thumbWidth = thumbSizeForStyle.width + let thumbHeight = thumbSizeForStyle.height + let rectangle = CGRect(x:thumbAbscisse - (thumbWidth / 2), + y: (frame.height - thumbHeight)/2, + width: thumbWidth, + height: thumbHeight) + + let shadowRadius = (thumbComponentStyle == .iOS) ? iOSThumbShadowRadius : thumbShadowRadius + let shadowOffset = (thumbComponentStyle == .iOS) ? iOSThumbShadowOffset : thumbShadowOffset + + thumbLayer.frame = ((shadowRadius != 0.0) // Ignore offset if there is no shadow + ? rectangle.insetBy(dx: shadowRadius + shadowOffset.width, + dy: shadowRadius + shadowOffset.height) + : rectangle.insetBy(dx: shadowRadius, + dy: shadowRadius)) + + switch thumbComponentStyle { + case .rounded: // A rounded thumb is circular + thumbLayer.backgroundColor = (thumbTintColor ?? UIColor.lightGray).cgColor + thumbLayer.borderColor = UIColor.clear.cgColor + thumbLayer.borderWidth = 0.0 + thumbLayer.cornerRadius = thumbLayer.frame.width/2 + thumbLayer.allowsEdgeAntialiasing = true + + case .image: + // image is set using layer.contents + thumbLayer.backgroundColor = UIColor.clear.cgColor + thumbLayer.borderColor = UIColor.clear.cgColor + thumbLayer.borderWidth = 0.0 + thumbLayer.cornerRadius = 0.0 + thumbLayer.allowsEdgeAntialiasing = false + + case .rectangular: + thumbLayer.backgroundColor = (thumbTintColor ?? UIColor.lightGray).cgColor + thumbLayer.borderColor = UIColor.clear.cgColor + thumbLayer.borderWidth = 0.0 + thumbLayer.cornerRadius = 0.0 + thumbLayer.allowsEdgeAntialiasing = false + + case .invisible: + thumbLayer.backgroundColor = UIColor.clear.cgColor + thumbLayer.cornerRadius = 0.0 + + case .iOS: + fallthrough + + default: + thumbLayer.backgroundColor = (thumbTintColor ?? UIColor.white).cgColor + + // Only default iOS thumb has a border + if nil == thumbTintColor { + let borderColor = UIColor(white:0.5, alpha: 1) + thumbLayer.borderColor = borderColor.cgColor + thumbLayer.borderWidth = 0.25 + } else { + thumbLayer.borderWidth = 0 + } + thumbLayer.cornerRadius = thumbLayer.frame.width/2 + thumbLayer.allowsEdgeAntialiasing = true + break + } + + // Shadow + if(shadowRadius != 0.0) { + #if TARGET_INTERFACE_BUILDER + thumbLayer.shadowOffset = CGSize(width: shadowOffset.width, + height: -shadowOffset.height) + #else // !TARGET_INTERFACE_BUILDER + thumbLayer.shadowOffset = shadowOffset + #endif // TARGET_INTERFACE_BUILDER + + thumbLayer.shadowRadius = shadowRadius + thumbLayer.shadowColor = UIColor.black.cgColor + thumbLayer.shadowOpacity = 0.15 + } else { + thumbLayer.shadowRadius = 0.0 + thumbLayer.shadowOffset = CGSize.zero + thumbLayer.shadowColor = UIColor.clear.cgColor + thumbLayer.shadowOpacity = 0.0 + } + } + } + + func layoutTrack() { + assert(tickCount > 1, "2 ticks minimum \(tickCount)") + let segments = max(1, tickCount - 1) + let thumbWidth = thumbSizeIncludingShadow().width + + // Calculate the track ticks positions + let trackHeight = (.iOS == trackComponentStyle) ? 2 : trackThickness + var trackSize = CGSize(width: frame.width - thumbWidth, + height: trackHeight) + if(.image == trackComponentStyle) { + if let trackImage = trackImage, + let image = UIImage(named: trackImage) { + trackSize.width = image.size.width - thumbWidth + } + } + + trackRectangle = CGRect(x: (frame.width - trackSize.width)/2, + y: (frame.height - trackSize.height)/2, + width: trackSize.width, + height: trackSize.height) + let trackY = frame.height / 2 + ticksAbscisses = [] + for iterate in 0 ..< segments { + let ratio = Double(iterate) / Double(segments) + let originX = trackRectangle.origin.x + (CGFloat)(trackSize.width * CGFloat(ratio)) + ticksAbscisses.append(CGPoint(x: originX, y: trackY)) + } + layoutThumb() + + // If we have a TGPDiscreteSliderTicksListener (such as TGPCamelLabels), broadcast new spacing + ticksListener?.tgpTicksDistanceChanged(ticksDistance:ticksDistance, sender:self) + setNeedsDisplay() + } + + func layoutThumb() { + assert(tickCount > 1, "2 ticks minimum \(tickCount)") + let segments = max(1, tickCount - 1) + + // Calculate the thumb position + let nonZeroIncrement = ((0 == incrementValue) ? 1 : incrementValue) + var thumbRatio = Double(value - minimumValue) / Double(segments * nonZeroIncrement) + thumbRatio = max(0.0, min(thumbRatio, 1.0)) // Normalized + thumbAbscisse = trackRectangle.origin.x + (CGFloat)(trackRectangle.width * CGFloat(thumbRatio)) + } + + func thumbSizeIncludingShadow() -> CGSize { + switch thumbComponentStyle { + case .invisible: + fallthrough + + case .rectangular: + fallthrough + + case .rounded: + return ((thumbShadowRadius != 0.0) + ? CGSize(width:thumbSize.width + + (thumbShadowRadius * 2) + + (thumbShadowOffset.width * 2), + height: thumbSize.height + + (thumbShadowRadius * 2) + + (thumbShadowOffset.height * 2)) + : thumbSize) + + case .iOS: + return CGSize(width: 28.0 + + (iOSThumbShadowRadius * 2) + + (iOSThumbShadowOffset.width * 2), + height: 28.0 + + (iOSThumbShadowRadius * 2) + + (iOSThumbShadowOffset.height * 2)) + + case .image: + if let thumbImage = thumbImage, + let image = UIImage(named: thumbImage) { + return image.size + } + fallthrough + + default: + return CGSize(width: 33, height: 33) + } + } + + // MARK: UIResponder + public override func touchesBegan(_ touches: Set, with event: UIEvent?) { + touchedInside = true + + touchDown(touches, animationDuration: 0.1) + sendActionForControlEvent(controlEvent: .valueChanged, with: event) + sendActionForControlEvent(controlEvent: .touchDown, with:event) + + if let touch = touches.first { + if touch.tapCount > 1 { + sendActionForControlEvent(controlEvent: .touchDownRepeat, with: event) + } + } + } + + public override func touchesMoved(_ touches: Set, with event: UIEvent?) { + touchDown(touches, animationDuration:0) + + let inside = touchesAreInside(touches) + sendActionForControlEvent(controlEvent: .valueChanged, with: event) + + if inside != touchedInside { // Crossing boundary + sendActionForControlEvent(controlEvent: (inside) ? .touchDragEnter : .touchDragExit, + with: event) + touchedInside = inside + } + // Drag + sendActionForControlEvent(controlEvent: (inside) ? .touchDragInside : .touchDragOutside, + with: event) + } + + public override func touchesEnded(_ touches: Set, with event: UIEvent?) { + touchUp(touches) + + sendActionForControlEvent(controlEvent: .valueChanged, with: event) + sendActionForControlEvent(controlEvent: (touchesAreInside(touches)) ? .touchUpInside : .touchUpOutside, + with: event) + } + + public override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + touchUp(touches) + + sendActionForControlEvent(controlEvent: .valueChanged, with:event) + sendActionForControlEvent(controlEvent: .touchCancel, with:event) + } + + + // MARK: Touches + + func touchDown(_ touches: Set, animationDuration duration:TimeInterval) { + if let touch = touches.first { + let location = touch.location(in: touch.view) + moveThumbTo(abscisse: location.x, animationDuration: duration) + } + } + + func touchUp(_ touches: Set) { + if let touch = touches.first { + let location = touch.location(in: touch.view) + let tick = pickTickFromSliderPosition(abscisse: location.x) + moveThumbToTick(tick: tick) + } + } + + func touchesAreInside(_ touches: Set) -> Bool { + var inside = false + if let touch = touches.first { + let location = touch.location(in: touch.view) + if let bounds = touch.view?.bounds { + inside = bounds.contains(location) + } + } + return inside + } + + // MARK: Notifications + + func moveThumbToTick(tick: UInt) { + let nonZeroIncrement = ((0 == incrementValue) ? 1 : incrementValue) + let intValue = Int(minimumValue) + (Int(tick) * nonZeroIncrement) + if intValue != self.intValue { + self.intValue = intValue + sendActionsForControlEvents() + } + + layoutThumb() + setNeedsDisplay() + } + + func moveThumbTo(abscisse:CGFloat, animationDuration duration:TimeInterval) { + let leftMost = trackRectangle.minX + let rightMost = trackRectangle.maxX + + thumbAbscisse = max(leftMost, min(abscisse, rightMost)) + CATransaction.setAnimationDuration(duration) + + let tick = pickTickFromSliderPosition(abscisse: thumbAbscisse) + let nonZeroIncrement = ((0 == incrementValue) ? 1 : incrementValue) + let intValue = Int(minimumValue) + (Int(tick) * nonZeroIncrement) + if intValue != self.intValue { + self.intValue = intValue + sendActionsForControlEvents() + } + + setNeedsDisplay() + } + + func pickTickFromSliderPosition(abscisse: CGFloat) -> UInt { + let leftMost = trackRectangle.minX + let rightMost = trackRectangle.maxX + let clampedAbscisse = max(leftMost, min(abscisse, rightMost)) + let ratio = Double(clampedAbscisse - leftMost) / Double(rightMost - leftMost) + let segments = max(1, tickCount - 1) + return UInt(round( Double(segments) * ratio)) + } + + func sendActionForControlEvent(controlEvent:UIControlEvents, with event:UIEvent?) { + for target in allTargets { + if let caActions = actions(forTarget: target, forControlEvent: controlEvent) { + for actionName in caActions { + sendAction(NSSelectorFromString(actionName), to: target, for: event) + } + } + } + } + + #if TARGET_INTERFACE_BUILDER + // MARK: TARGET_INTERFACE_BUILDER stub + // Interface builder hides the IBInspectable for UIControl + + let allTargets: Set = Set() + func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControlEvents) {} + func actions(forTarget target: Any?, forControlEvent controlEvent: UIControlEvents) -> [String]? { return nil } + func sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {} + #endif // TARGET_INTERFACE_BUILDER +} diff --git a/TGPControlsDemo/Podfile b/TGPControlsDemo/Podfile index ef85fe6..449a4df 100644 --- a/TGPControlsDemo/Podfile +++ b/TGPControlsDemo/Podfile @@ -1,10 +1,9 @@ -platform :ios, '9.3' +platform :ios, '8.0' + +use_frameworks! target 'TGPControlsDemo' do - use_frameworks! - - # Pods for TGPControlsDemo - pod 'TGPControls', :path => '../../TGPControls' + pod 'TGPControls', :path => '../../TGPControls' end diff --git a/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj b/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj index f68c42f..8e84583 100644 --- a/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj +++ b/TGPControlsDemo/TGPControlsDemo.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 49DFBE652BC3561E5CB5AC71 /* Pods_TGPControlsDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 581DB63BCDD6158FFB0D74E5 /* Pods_TGPControlsDemo.framework */; }; + 803A99D2DE444E51D1C80154 /* Pods_TGPControlsDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F81ED809FBD1E88B2963FDC /* Pods_TGPControlsDemo.framework */; }; DC56BDC71E46DEB900AAD0D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC56BDC61E46DEB900AAD0D9 /* AppDelegate.swift */; }; DC56BDC91E46DEB900AAD0D9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC56BDC81E46DEB900AAD0D9 /* ViewController.swift */; }; DC56BDCC1E46DEB900AAD0D9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC56BDCA1E46DEB900AAD0D9 /* Main.storyboard */; }; @@ -16,9 +16,9 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 581DB63BCDD6158FFB0D74E5 /* Pods_TGPControlsDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TGPControlsDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 92A7F603AAEAC96A55AB65B0 /* Pods-TGPControlsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.release.xcconfig"; sourceTree = ""; }; - DA8C1E8D17DDF9A4BE0D574A /* Pods-TGPControlsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.debug.xcconfig"; sourceTree = ""; }; + 2ED040B4FCE5A995907CE089 /* Pods-TGPControlsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.debug.xcconfig"; sourceTree = ""; }; + 2F4F0B11EC6CA5DCEA1DB883 /* Pods-TGPControlsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo/Pods-TGPControlsDemo.release.xcconfig"; sourceTree = ""; }; + 5F81ED809FBD1E88B2963FDC /* Pods_TGPControlsDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TGPControlsDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DC56BDC31E46DEB900AAD0D9 /* TGPControlsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TGPControlsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; DC56BDC61E46DEB900AAD0D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DC56BDC81E46DEB900AAD0D9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -33,37 +33,37 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 49DFBE652BC3561E5CB5AC71 /* Pods_TGPControlsDemo.framework in Frameworks */, + 803A99D2DE444E51D1C80154 /* Pods_TGPControlsDemo.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 4377D1C5D815215296FB706C /* Pods */ = { + 10EC92099730DF4A939701BE /* Frameworks */ = { isa = PBXGroup; children = ( - DA8C1E8D17DDF9A4BE0D574A /* Pods-TGPControlsDemo.debug.xcconfig */, - 92A7F603AAEAC96A55AB65B0 /* Pods-TGPControlsDemo.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - 9913583EE20668591C0787BB /* Frameworks */ = { - isa = PBXGroup; - children = ( - 581DB63BCDD6158FFB0D74E5 /* Pods_TGPControlsDemo.framework */, + 5F81ED809FBD1E88B2963FDC /* Pods_TGPControlsDemo.framework */, ); name = Frameworks; sourceTree = ""; }; + 5B4B1FA5E4029B453F087869 /* Pods */ = { + isa = PBXGroup; + children = ( + 2ED040B4FCE5A995907CE089 /* Pods-TGPControlsDemo.debug.xcconfig */, + 2F4F0B11EC6CA5DCEA1DB883 /* Pods-TGPControlsDemo.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; DC56BDBA1E46DEB900AAD0D9 = { isa = PBXGroup; children = ( DC56BDC51E46DEB900AAD0D9 /* TGPControlsDemo */, DC56BDC41E46DEB900AAD0D9 /* Products */, - 4377D1C5D815215296FB706C /* Pods */, - 9913583EE20668591C0787BB /* Frameworks */, + 5B4B1FA5E4029B453F087869 /* Pods */, + 10EC92099730DF4A939701BE /* Frameworks */, ); sourceTree = ""; }; @@ -242,6 +242,7 @@ DC56BDD31E46DEB900AAD0D9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -279,7 +280,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -292,6 +293,7 @@ DC56BDD41E46DEB900AAD0D9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -323,7 +325,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -334,8 +336,9 @@ }; DC56BDD61E46DEB900AAD0D9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DA8C1E8D17DDF9A4BE0D574A /* Pods-TGPControlsDemo.debug.xcconfig */; + baseConfigurationReference = 2ED040B4FCE5A995907CE089 /* Pods-TGPControlsDemo.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 55K7THBUV8; INFOPLIST_FILE = TGPControlsDemo/Info.plist; @@ -348,8 +351,9 @@ }; DC56BDD71E46DEB900AAD0D9 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 92A7F603AAEAC96A55AB65B0 /* Pods-TGPControlsDemo.release.xcconfig */; + baseConfigurationReference = 2F4F0B11EC6CA5DCEA1DB883 /* Pods-TGPControlsDemo.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 55K7THBUV8; INFOPLIST_FILE = TGPControlsDemo/Info.plist; @@ -379,6 +383,7 @@ DC56BDD71E46DEB900AAD0D9 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard b/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard index 988afa4..ff95622 100644 --- a/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard +++ b/TGPControlsDemo/TGPControlsDemo/Base.lproj/Main.storyboard @@ -35,7 +35,7 @@ - + @@ -67,7 +67,7 @@ - + @@ -101,7 +101,7 @@ - + @@ -139,7 +139,7 @@ - + @@ -177,7 +177,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -296,7 +296,7 @@ - + @@ -335,7 +335,7 @@ - + @@ -364,10 +364,10 @@ - + - + @@ -384,7 +384,7 @@ - + diff --git a/TGPControlsDemo/TGPControlsDemo/ViewController.swift b/TGPControlsDemo/TGPControlsDemo/ViewController.swift index 4ce5f6e..9b90047 100644 --- a/TGPControlsDemo/TGPControlsDemo/ViewController.swift +++ b/TGPControlsDemo/TGPControlsDemo/ViewController.swift @@ -19,6 +19,7 @@ // THE SOFTWARE. import UIKit +import TGPControls class ViewController: UIViewController { @IBOutlet weak var oneTo10Labels: TGPCamelLabels! diff --git a/TGPControlsDemo7/Podfile b/TGPControlsDemo7/Podfile deleted file mode 100644 index a6944e9..0000000 --- a/TGPControlsDemo7/Podfile +++ /dev/null @@ -1,7 +0,0 @@ -platform :ios, '7.0' -source 'https://github.com/CocoaPods/Specs.git' - -target 'TGPControlsDemo7' do - #pod 'TGPControls', :path => '../../TGPControls' - pod 'TGPControls' -end diff --git a/TGPControlsDemo7/TGPControlsDemo7.xcodeproj/project.pbxproj b/TGPControlsDemo7/TGPControlsDemo7.xcodeproj/project.pbxproj deleted file mode 100644 index 7690b7d..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7.xcodeproj/project.pbxproj +++ /dev/null @@ -1,372 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - A506FFB267F7DB477E7645C6 /* libPods-TGPControlsDemo7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CF5B835790FE83208A2032 /* libPods-TGPControlsDemo7.a */; }; - DC74B6791A901699001DC526 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DC74B6781A901699001DC526 /* main.m */; }; - DC74B67C1A901699001DC526 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DC74B67B1A901699001DC526 /* AppDelegate.m */; }; - DC74B67F1A901699001DC526 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC74B67E1A901699001DC526 /* ViewController.m */; }; - DC74B6821A901699001DC526 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC74B6801A901699001DC526 /* Main.storyboard */; }; - DC74B6841A901699001DC526 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DC74B6831A901699001DC526 /* Images.xcassets */; }; - DC74B6871A901699001DC526 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = DC74B6851A901699001DC526 /* LaunchScreen.xib */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 3227B7F26D7BFA5B9536A0DB /* Pods-TGPControlsDemo7.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo7.release.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo7/Pods-TGPControlsDemo7.release.xcconfig"; sourceTree = ""; }; - 9D6EC9A4396AF16D62F320EE /* Pods-TGPControlsDemo7.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TGPControlsDemo7.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TGPControlsDemo7/Pods-TGPControlsDemo7.debug.xcconfig"; sourceTree = ""; }; - C3CF5B835790FE83208A2032 /* libPods-TGPControlsDemo7.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-TGPControlsDemo7.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - DC74B6731A901699001DC526 /* TGPControlsDemo7.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TGPControlsDemo7.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DC74B6771A901699001DC526 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DC74B6781A901699001DC526 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - DC74B67A1A901699001DC526 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - DC74B67B1A901699001DC526 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - DC74B67D1A901699001DC526 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - DC74B67E1A901699001DC526 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - DC74B6811A901699001DC526 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - DC74B6831A901699001DC526 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - DC74B6861A901699001DC526 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - DCC831371A9017670047F142 /* Podfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Podfile; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - DC74B6701A901699001DC526 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A506FFB267F7DB477E7645C6 /* libPods-TGPControlsDemo7.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 2BAC7104A1110CC622B002A7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - C3CF5B835790FE83208A2032 /* libPods-TGPControlsDemo7.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - DC74B66A1A901699001DC526 = { - isa = PBXGroup; - children = ( - DCC831371A9017670047F142 /* Podfile */, - DC74B6751A901699001DC526 /* TGPControlsDemo7 */, - DC74B6741A901699001DC526 /* Products */, - EA8C94FA4563F0443C64E897 /* Pods */, - 2BAC7104A1110CC622B002A7 /* Frameworks */, - ); - sourceTree = ""; - }; - DC74B6741A901699001DC526 /* Products */ = { - isa = PBXGroup; - children = ( - DC74B6731A901699001DC526 /* TGPControlsDemo7.app */, - ); - name = Products; - sourceTree = ""; - }; - DC74B6751A901699001DC526 /* TGPControlsDemo7 */ = { - isa = PBXGroup; - children = ( - DC74B67A1A901699001DC526 /* AppDelegate.h */, - DC74B67B1A901699001DC526 /* AppDelegate.m */, - DC74B67D1A901699001DC526 /* ViewController.h */, - DC74B67E1A901699001DC526 /* ViewController.m */, - DC74B6801A901699001DC526 /* Main.storyboard */, - DC74B6831A901699001DC526 /* Images.xcassets */, - DC74B6851A901699001DC526 /* LaunchScreen.xib */, - DC74B6761A901699001DC526 /* Supporting Files */, - ); - path = TGPControlsDemo7; - sourceTree = ""; - }; - DC74B6761A901699001DC526 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DC74B6771A901699001DC526 /* Info.plist */, - DC74B6781A901699001DC526 /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - EA8C94FA4563F0443C64E897 /* Pods */ = { - isa = PBXGroup; - children = ( - 9D6EC9A4396AF16D62F320EE /* Pods-TGPControlsDemo7.debug.xcconfig */, - 3227B7F26D7BFA5B9536A0DB /* Pods-TGPControlsDemo7.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - DC74B6721A901699001DC526 /* TGPControlsDemo7 */ = { - isa = PBXNativeTarget; - buildConfigurationList = DC74B6961A901699001DC526 /* Build configuration list for PBXNativeTarget "TGPControlsDemo7" */; - buildPhases = ( - FEE5971EB6029A24184C34B2 /* Check Pods Manifest.lock */, - DC74B66F1A901699001DC526 /* Sources */, - DC74B6701A901699001DC526 /* Frameworks */, - DC74B6711A901699001DC526 /* Resources */, - CEF1711B486B1BADB4F115FF /* Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = TGPControlsDemo7; - productName = TGPControlsDemo7; - productReference = DC74B6731A901699001DC526 /* TGPControlsDemo7.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - DC74B66B1A901699001DC526 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0710; - ORGANIZATIONNAME = TheGothicParty; - TargetAttributes = { - DC74B6721A901699001DC526 = { - CreatedOnToolsVersion = 6.1.1; - }; - }; - }; - buildConfigurationList = DC74B66E1A901699001DC526 /* Build configuration list for PBXProject "TGPControlsDemo7" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = DC74B66A1A901699001DC526; - productRefGroup = DC74B6741A901699001DC526 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DC74B6721A901699001DC526 /* TGPControlsDemo7 */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - DC74B6711A901699001DC526 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DC74B6821A901699001DC526 /* Main.storyboard in Resources */, - DC74B6871A901699001DC526 /* LaunchScreen.xib in Resources */, - DC74B6841A901699001DC526 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - CEF1711B486B1BADB4F115FF /* Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TGPControlsDemo7/Pods-TGPControlsDemo7-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - FEE5971EB6029A24184C34B2 /* Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - DC74B66F1A901699001DC526 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DC74B67F1A901699001DC526 /* ViewController.m in Sources */, - DC74B67C1A901699001DC526 /* AppDelegate.m in Sources */, - DC74B6791A901699001DC526 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - DC74B6801A901699001DC526 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - DC74B6811A901699001DC526 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - DC74B6851A901699001DC526 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - DC74B6861A901699001DC526 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - DC74B6941A901699001DC526 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - DC74B6951A901699001DC526 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DC74B6971A901699001DC526 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9D6EC9A4396AF16D62F320EE /* Pods-TGPControlsDemo7.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - INFOPLIST_FILE = TGPControlsDemo7/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.thegothicparty.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - DC74B6981A901699001DC526 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3227B7F26D7BFA5B9536A0DB /* Pods-TGPControlsDemo7.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - INFOPLIST_FILE = TGPControlsDemo7/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.thegothicparty.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - DC74B66E1A901699001DC526 /* Build configuration list for PBXProject "TGPControlsDemo7" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC74B6941A901699001DC526 /* Debug */, - DC74B6951A901699001DC526 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DC74B6961A901699001DC526 /* Build configuration list for PBXNativeTarget "TGPControlsDemo7" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC74B6971A901699001DC526 /* Debug */, - DC74B6981A901699001DC526 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = DC74B66B1A901699001DC526 /* Project object */; -} diff --git a/TGPControlsDemo7/TGPControlsDemo7/AppDelegate.m b/TGPControlsDemo7/TGPControlsDemo7/AppDelegate.m deleted file mode 100644 index 3035601..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/AppDelegate.m +++ /dev/null @@ -1,67 +0,0 @@ -// @file: AppDelegate.m -// @project: TGPControlsDemo7 (TGPControls) -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "AppDelegate.h" - -@interface AppDelegate () - -@end - -@implementation AppDelegate - - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - // Override point for customization after application launch. - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application { - // 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. - // 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. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application { - // 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. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application { - // 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. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application { - // 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. -} - -- (void)applicationWillTerminate:(UIApplication *)application { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/TGPControlsDemo7/TGPControlsDemo7/Base.lproj/LaunchScreen.xib b/TGPControlsDemo7/TGPControlsDemo7/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 0c5a5a5..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TGPControlsDemo7/TGPControlsDemo7/Base.lproj/Main.storyboard b/TGPControlsDemo7/TGPControlsDemo7/Base.lproj/Main.storyboard deleted file mode 100644 index 17930ce..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Base.lproj/Main.storyboard +++ /dev/null @@ -1,485 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/AppIcon.appiconset/Contents.json b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 36d2c80..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/Contents.json b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Contents.json b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index c682b54..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "Default-2x.png", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "extent" : "full-screen", - "idiom" : "iphone", - "subtype" : "retina4", - "filename" : "Default-Retina4.png", - "minimum-system-version" : "7.0", - "orientation" : "portrait", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Default-2x.png b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Default-2x.png deleted file mode 100644 index d29728b28fcdd35813fb0aead9b7164668ee074a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31948 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 diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Default-Retina4.png b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/LaunchImage.launchimage/Default-Retina4.png deleted file mode 100644 index 9df2f8e0d72b49a3d93f09e68bbd3252ff3c58b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34979 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

5st=z z3jNV;*_X(K(va>0SQNo=*6c2iS6`n9Xz53(otXf5_|70E%s~JFDS-Mz?+X-I93m30 zaI#t>thZWZeE6lRZP^-EulS7qv+s*kd$f;Scqj#_KxIfGeg22l@1o;@C*`%BOW9`u zvnx{z{6qK}l-T(5p{1U}DRy)5F=R#TkJk=adme8?UASLCx!!+8IPSxrhoT9s;2If> zf*y5u;WSZx#HEN^+!dou7@I&n^5e35!cbG=zJC}a53j3!B$G7kBNG(6Y&`gx1L7c+ z13#ts#~}?$>?UWQg_nt_tw8833v^}U7_P?BP1IPU;g%(u8z=99vWmXDRc(UbCCFHa z1W8o8v2laNqBIfBAMFNz@|{TgNppz;~YEGoe8~;dTb67~PXK5AV z9`V!vjr)Kr3+Lgk{4cb-n1(%y30}?~ecR`YaPK!W^2kb={H+|oh)Oq*cK^$W`}F9{ zr1M}GnE^j2>v5;Um*8A+VN>*RYh6f+WSJ9}Dz)Osg)aD@e~s-fis7ItqqcQ*nW20e zZ9d@Dw)sv~_*Hdhqp}RK6L?V~mEC{4oQ=U2-Nq$F7gFE7^2eO9@8K)q^Hl0}Y*5~^ZL=_~R5k~IC1oU@bkC2O z`W^+*OM-0EYEq7*bGhSiTtCx6}#~N0Z#>t+W-In diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/thumb.imageset/Contents.json b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/thumb.imageset/Contents.json deleted file mode 100644 index 4ae76f3..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/thumb.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "wthumb.png" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/thumb.imageset/wthumb.png b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/thumb.imageset/wthumb.png deleted file mode 100644 index 1713f044091cf5cbb81219f556f09effe918b9e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5601 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 ap#lKvxa(zDPKdvCm#&tfX7LS&(0>6&!jy;r diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/tick.imageset/Contents.json b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/tick.imageset/Contents.json deleted file mode 100644 index d15e75f..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/tick.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "wtick.png" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/tick.imageset/wtick.png b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/tick.imageset/wtick.png deleted file mode 100644 index 7527bdf1d0fc4ab278d03284a0b63b88e38f04d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5572 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 diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/track.imageset/Contents.json b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/track.imageset/Contents.json deleted file mode 100644 index 91ef2b9..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/track.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "wtrack.png" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/track.imageset/wtrack.png b/TGPControlsDemo7/TGPControlsDemo7/Images.xcassets/track.imageset/wtrack.png deleted file mode 100644 index 425c867b6df23591872ca6b85844eb18a62dac0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5799 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 - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/TGPControlsDemo7/TGPControlsDemo7/ViewController.m b/TGPControlsDemo7/TGPControlsDemo7/ViewController.m deleted file mode 100644 index 0a59a8a..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/ViewController.m +++ /dev/null @@ -1,136 +0,0 @@ -// @file: ViewController.m -// @project: TGPControlsDemo7 (TGPControls) -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "ViewController.h" -#import "TGPDiscreteSlider7.h" -#import "TGPCamelLabels7.h" - -@interface ViewController () - -// iOS 7 does not support IBInspectable, so use the .7 class for both controls. -// If your project targets iOS 8+, you should use TGPDiscreteSlider & TGPCamelLabels instead - -@property (weak, nonatomic) IBOutlet TGPCamelLabels7 *oneTo10Labels; -@property (weak, nonatomic) IBOutlet TGPDiscreteSlider7 *oneTo10Slider; - -@property (weak, nonatomic) IBOutlet TGPCamelLabels7 *alphabetLabels; -@property (weak, nonatomic) IBOutlet TGPDiscreteSlider7 *alphabetSlider; - -@property (weak, nonatomic) IBOutlet TGPCamelLabels7 * pictureLabels; -@property (weak, nonatomic) IBOutlet TGPDiscreteSlider7 * pictureSlider; - -@property (weak, nonatomic) IBOutlet TGPCamelLabels7 *switch1Camel; -@property (weak, nonatomic) IBOutlet TGPCamelLabels7 *switch2Camel; - -@property (weak, nonatomic) IBOutlet UILabel *controlEventsLabel; -@property (weak, nonatomic) IBOutlet TGPDiscreteSlider7 *dualColorSlider; -@property (weak, nonatomic) IBOutlet UIStepper *stepper; -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.alphabetLabels.names = @[@"A",@"B",@"C",@"D",@"E",@"F", @"G",@"H",@"I",@"J",@"K",@"L",@"M", - @"N",@"O",@"P",@"Q",@"R",@"S", @"T",@"U",@"V",@"W",@"X",@"Y",@"Z"]; - self.pictureLabels.names = @[@"orient", @"occident", @"zénith", @"nadir", @"septentrion", @"midi"]; - self.switch1Camel.names = @[@"OFF", @"ON"]; - self.switch2Camel.names = @[@"O", @"l"]; - - // Automatically track tick spacing changes - self.alphabetSlider.ticksListener = self.alphabetLabels; - self.oneTo10Slider.ticksListener = self.oneTo10Labels; - self.pictureSlider.ticksListener = self.pictureLabels; - - // UIControlEvents - [self.dualColorSlider addTarget:self action:@selector(touchDown:event:) forControlEvents:UIControlEventTouchDown]; - [self.dualColorSlider addTarget:self action:@selector(touchDownRepeat:event:) forControlEvents:UIControlEventTouchDownRepeat]; - [self.dualColorSlider addTarget:self action:@selector(touchDragInside:event:) forControlEvents:UIControlEventTouchDragInside]; - [self.dualColorSlider addTarget:self action:@selector(touchDragOutside:event:) forControlEvents:UIControlEventTouchDragOutside]; - [self.dualColorSlider addTarget:self action:@selector(touchDragEnter:event:) forControlEvents:UIControlEventTouchDragEnter]; - [self.dualColorSlider addTarget:self action:@selector(touchDragExit:event:) forControlEvents:UIControlEventTouchDragExit]; - [self.dualColorSlider addTarget:self action:@selector(touchUpInside:event:) forControlEvents:UIControlEventTouchUpInside]; - [self.dualColorSlider addTarget:self action:@selector(touchUpOutside:event:) forControlEvents:UIControlEventTouchUpOutside]; - [self.dualColorSlider addTarget:self action:@selector(touchCancel:event:) forControlEvents:UIControlEventTouchCancel]; - [self.dualColorSlider addTarget:self action:@selector(valueChanged:event:) forControlEvents:UIControlEventValueChanged]; -} - -#pragma mark - UISwitch - -- (IBAction)switch1ValueChanged:(UISwitch *)sender { - [self.switch1Camel setValue:((sender.isOn) ? 1 : 0)]; -} - -- (IBAction)switch2TouchUpInside:(UISwitch *)sender { - [self.switch2Camel setValue:((sender.isOn) ? 1 : 0)]; -} - -#pragma mark - UIControlEvents - -- (void)touchDown:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchDown"; -} -- (void)touchDownRepeat:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchDownRepeat"; -} -- (void)touchDragInside:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchDragInside"; -} -- (void)touchDragOutside:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchDragOutside"; -} -- (void)touchDragEnter:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchDragEnter"; -} -- (void)touchDragExit:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchDragExit"; -} -- (void)touchUpInside:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchUpInside"; -} -- (void)touchUpOutside:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchUpOutside"; -} -- (void)touchCancel:(UIControl *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"touchCancel"; -} -- (void)valueChanged:(TGPDiscreteSlider7 *)sender event:(UIEvent *)event { - self.controlEventsLabel.text = @"valueChanged"; - self.stepper.value = (double) sender.value; -} - -#pragma mark - UIStepper - -- (IBAction)stepperValueChanged:(UIStepper *)sender { - self.dualColorSlider.value = (CGFloat) sender.value; -} - -@end \ No newline at end of file diff --git a/TGPControlsDemo7/TGPControlsDemo7/main.m b/TGPControlsDemo7/TGPControlsDemo7/main.m deleted file mode 100644 index 47a089c..0000000 --- a/TGPControlsDemo7/TGPControlsDemo7/main.m +++ /dev/null @@ -1,38 +0,0 @@ -// @file: main.m -// @project: TGPControlsDemo7 (TGPControls) -// -// @history: Created November 27, 2014 (Thanksgiving Day) -// @author: Xavier Schott -// mailto://xschott@gmail.com -// http://thegothicparty.com -// tel://+18089383634 -// -// @license: http://opensource.org/licenses/MIT -// Copyright (c) 2014, Xavier Schott -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/TGPControls_License.txt b/TGPControls_License.txt index 91b666c..744ac57 100644 --- a/TGPControls_License.txt +++ b/TGPControls_License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2014 Xavier Schott +Copyright (c) 2017 Xavier Schott Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -16,4 +16,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +THE SOFTWARE. From cc1a440b112a2877c67479d468a49c97d0656650 Mon Sep 17 00:00:00 2001 From: Xavier Schott Date: Sat, 11 Feb 2017 16:05:20 -0800 Subject: [PATCH 3/5] Replaced the animate flag by emphasisLayout and regularLyout to control how labels move up, down or not at all --- TGPControls/TGPCamelLabels.swift | 147 +++++++++++++++++++++---------- 1 file changed, 102 insertions(+), 45 deletions(-) diff --git a/TGPControls/TGPCamelLabels.swift b/TGPControls/TGPCamelLabels.swift index 3276e37..6f51511 100644 --- a/TGPControls/TGPCamelLabels.swift +++ b/TGPControls/TGPCamelLabels.swift @@ -29,9 +29,14 @@ import UIKit + @IBDesignable public class TGPCamelLabels: UIControl { + let validAttributes = [NSLayoutAttribute.top.rawValue, // 3 + NSLayoutAttribute.centerY.rawValue, // 10 + NSLayoutAttribute.bottom.rawValue] // 4 + // Only used if labels.count < 1 @IBInspectable public var tickCount:Int { get { @@ -109,6 +114,52 @@ public class TGPCamelLabels: UIControl { } } + // Where should emphasized labels be drawn (10: centerY, 3: top, 4: bottom) + // By default, emphasized labels are animated towards the top of the frame. + // This creates the dock effect (camel). They can also be centered vertically, or move down (reverse effect). + @IBInspectable public var emphasisLayout:Int = NSLayoutAttribute.top.rawValue { + didSet { + if !validAttributes.contains(emphasisLayout) { + emphasisLayout = NSLayoutAttribute.top.rawValue + } + layoutTrack() + } + } + + // Where should regular labels be drawn (10: centerY, 3: top, 4: bottom) + // By default, emphasized labels are animated towards the bottom of the frame. + // This creates the dock effect (camel). They can also be centered vertically, or move up (reverse effect). + @IBInspectable public var regularLayout:Int = NSLayoutAttribute.bottom.rawValue { + didSet { + if !validAttributes.contains(regularLayout) { + regularLayout = NSLayoutAttribute.bottom.rawValue + } + layoutTrack() + } + } + + // MARK: @IBInspectable adapters + + public var emphasisLayoutAttribute:NSLayoutAttribute { + get { + return NSLayoutAttribute(rawValue: emphasisLayout) ?? .top + } + set { + emphasisLayout = newValue.rawValue + } + } + + public var regularLayoutAttribute:NSLayoutAttribute { + get { + return NSLayoutAttribute(rawValue: regularLayout) ?? .bottom + } + set { + regularLayout = newValue.rawValue + } + } + + // MARK: Properties + public var names:[String] = [] { // Will dictate the number of ticks didSet { assert(names.count > 0) @@ -126,13 +177,10 @@ public class TGPCamelLabels: UIControl { public var animationDuration:TimeInterval = 0.15 - // Fishy - var animate = true - // Private var lastValue = NSNotFound - var upLabels:[UILabel] = [] - var dnLabels:[UILabel] = [] + var emphasizedLabels:[UILabel] = [] + var regularLabels:[UILabel] = [] // MARK: UIView @@ -189,14 +237,14 @@ public class TGPCamelLabels: UIControl { } } - for label in upLabels { + for label in emphasizedLabels { label.removeFromSuperview() } - upLabels = [] - for label in dnLabels { + emphasizedLabels = [] + for label in regularLabels { label.removeFromSuperview() } - dnLabels = [] + regularLabels = [] let count = names.count if count > 0 { @@ -204,7 +252,7 @@ public class TGPCamelLabels: UIControl { let centerY = bounds.height / 2.0 for name in names { let upLabel = UILabel.init() - upLabels.append(upLabel) + emphasizedLabels.append(upLabel) upLabel.text = name if let upFontName = upFontName { upLabel.font = UIFont.init(name: upFontName, size: upFontSize) @@ -227,7 +275,7 @@ public class TGPCamelLabels: UIControl { addSubview(upLabel) let dnLabel = UILabel.init() - dnLabels.append(dnLabel) + regularLabels.append(dnLabel) dnLabel.text = name if let downFontName = downFontName { dnLabel.font = UIFont.init(name:downFontName, size:downFontSize) @@ -249,10 +297,10 @@ public class TGPCamelLabels: UIControl { // Fix left and right label, if there are at least 2 labels if names.count > 1 { - insetLabel(upLabels.first, withInset: insets, andMultiplier: offCenter) - insetLabel(upLabels.last, withInset: -insets, andMultiplier: -offCenter) - insetLabel(dnLabels.first, withInset: insets, andMultiplier: offCenter) - insetLabel(dnLabels.last, withInset: -insets, andMultiplier: -offCenter) + insetLabel(emphasizedLabels.first, withInset: insets, andMultiplier: offCenter) + insetLabel(emphasizedLabels.last, withInset: -insets, andMultiplier: -offCenter) + insetLabel(regularLabels.first, withInset: insets, andMultiplier: offCenter) + insetLabel(regularLabels.last, withInset: -insets, andMultiplier: -offCenter) } dockEffect(duration:0.0) @@ -262,7 +310,7 @@ public class TGPCamelLabels: UIControl { func dockEffect(duration:TimeInterval) { - let up = Int(value) + let emphasized = Int(value) // Unlike the National Parks from which it is inspired, this Dock Effect // does not abruptly change from BOLD to plain. Instead, we have 2 sets of @@ -272,25 +320,33 @@ public class TGPCamelLabels: UIControl { // - high to low // Each animation picks up where the previous left off let moveBlock:() -> Void = { - let x = self.upLabels - // Bring almost all down - for (idx, label) in self.upLabels.enumerated() { - if up != idx { - self.moveDown(aView: label, withAlpha: 0) + let x = self.emphasizedLabels + // De-emphasize almost all + for (idx, label) in self.emphasizedLabels.enumerated() { + if emphasized != idx { + self.verticalAlign(aView: label, + alpha: 0, + attribute: self.regularLayoutAttribute) } } - for (idx, label) in self.dnLabels.enumerated() { - if up != idx { - self.moveDown(aView: label, withAlpha: 1) + for (idx, label) in self.regularLabels.enumerated() { + if emphasized != idx { + self.verticalAlign(aView: label, + alpha: 1, + attribute: self.regularLayoutAttribute) } } - // Bring the selection up - if up < self.upLabels.count { - self.moveUp(aView: self.upLabels[up], withAlpha:1) + // Emphasize the selection + if emphasized < self.emphasizedLabels.count { + self.verticalAlign(aView: self.emphasizedLabels[emphasized], + alpha:1, + attribute: self.emphasisLayoutAttribute) } - if up < self.dnLabels.count { - self.moveUp(aView: self.dnLabels[up], withAlpha:0) + if emphasized < self.regularLabels.count { + self.verticalAlign(aView: self.regularLabels[emphasized], + alpha:0, + attribute: self.emphasisLayoutAttribute) } } @@ -305,30 +361,31 @@ public class TGPCamelLabels: UIControl { } } - func moveDown(aView:UIView, withAlpha alpha:CGFloat) - { - if animate { - aView.frame = { - var frame = aView.frame - frame.origin.y = bounds.height - frame.height - return frame - }() - } - aView.alpha = alpha - } - - func moveUp(aView:UIView, withAlpha alpha:CGFloat) - { - if animate { + func verticalAlign(aView:UIView, alpha alpha:CGFloat, attribute layout:NSLayoutAttribute) { + switch layout { + case .top: aView.frame = { var frame = aView.frame frame.origin.y = 0 return frame }() + + case .bottom: + aView.frame = { + var frame = aView.frame + frame.origin.y = bounds.height - frame.height + return frame + }() + + default: // .center + aView.frame = { + var frame = aView.frame + frame.origin.y = (bounds.height - frame.height) / 2 + return frame + }() } aView.alpha = alpha } - } extension TGPCamelLabels : TGPControlsTicksProtocol { From bb2ee57265623cb8b6c381b7990d50e7e88dc8b3 Mon Sep 17 00:00:00 2001 From: Xavier Schott Date: Mon, 13 Feb 2017 11:53:06 -0800 Subject: [PATCH 4/5] Podspec --- TGPControls_License.txt => LICENSE | 0 TGPControls.podspec | 111 +++++------------------------ 2 files changed, 16 insertions(+), 95 deletions(-) rename TGPControls_License.txt => LICENSE (100%) diff --git a/TGPControls_License.txt b/LICENSE similarity index 100% rename from TGPControls_License.txt rename to LICENSE diff --git a/TGPControls.podspec b/TGPControls.podspec index dcc33fb..72ce11c 100644 --- a/TGPControls.podspec +++ b/TGPControls.podspec @@ -1,114 +1,35 @@ -# -# Be sure to run `pod spec lint TGPControls.podspec' to ensure this is a -# valid spec and to remove all comments including this before submitting the spec. -# -# To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html -# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ -# - -Pod::Spec.new do |s| +Pod::Spec.new do |spec| # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # These will help people to find your library, and whilst it - # can feel like a chore to fill in it's definitely to your advantage. The - # summary should be tweet-length, and the description more in depth. - # + spec.name = "TGPControls" + spec.version = "3.0.0" + spec.summary = "Custom Awesome iOS Controls: Animated discrete slider, animated labels" - s.name = "TGPControls" - s.version = "3.0.0" - s.summary = "Custom Awesome iOS Controls: Animated discrete slider, animated labels" - - s.description = <<-DESC + spec.description = <<-DESC Provide an iOS looking UISlider with discrete, controlable steps Provide dynamic, animated labels for discrete slider Entirely compatible with UISlider - DESC - - s.homepage = "https://github.com/SwiftArchitect/TGPControls" - s.screenshots = "https://cloud.githubusercontent.com/assets/4073988/5912371/144aaf24-a588-11e4-9a22-42832eb2c235.gif", "https://cloud.githubusercontent.com/assets/4073988/5912454/15774398-a589-11e4-8f08-18c9c7b59871.gif", "https://cloud.githubusercontent.com/assets/4073988/6628373/183c7452-c8c2-11e4-9a63-107805bc0cc4.gif", "https://cloud.githubusercontent.com/assets/4073988/5912297/c3f21bb2-a586-11e4-8eb1-a1f930ccbdd5.gif" - + spec.homepage = "https://github.com/SwiftArchitect/TGPControls" + spec.screenshots = "https://cloud.githubusercontent.com/assets/4073988/5912371/144aaf24-a588-11e4-9a22-42832eb2c235.gif", "https://cloud.githubusercontent.com/assets/4073988/5912454/15774398-a589-11e4-8f08-18c9c7b59871.gif", "https://cloud.githubusercontent.com/assets/4073988/6628373/183c7452-c8c2-11e4-9a63-107805bc0cc4.gif", "https://cloud.githubusercontent.com/assets/4073988/5912297/c3f21bb2-a586-11e4-8eb1-a1f930ccbdd5.gif" # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Licensing your code is important. See http://choosealicense.com for more info. - # CocoaPods will detect a license file if there is a named LICENSE* - # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. - # - - s.license = { :type => "MIT", :file => "TGPControls_License.txt" } - + spec.license = { :type => "MIT", :file => "LICENSE" } # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Specify the authors of the library, with email addresses. Email addresses - # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also - # accepts just a name if you'd rather not provide an email address. - # - # Specify a social_media_url where others can refer to, for example a twitter - # profile URL. - # - - s.author = { "Xavier Schott" => "http://swiftarchitect.com/swiftarchitect/" } - #s.social_media_url = "https://twitter.com/swiftarchitect" - + spec.author = { "Xavier Schott" => "http://swiftarchitect.com/swiftarchitect/" } # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # If this Pod runs only on iOS or OS X, then specify the platform and - # the deployment target. You can optionally include the target after the platform. - # - - s.platform = :ios - s.ios.deployment_target = '8.0' - s.requires_arc = true - + spec.platform = :ios + spec.ios.deployment_target = '8.0' + spec.requires_arc = true # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Specify the location from where the source should be retrieved. - # Supports git, hg, bzr, svn and HTTP. - # - - s.source = { :git => "https://github.com/SwiftArchitect/TGPControls.git", :tag => "v3.0.0" } - - - # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # CocoaPods is smart about how it includes source code. For source files - # giving a folder will include any h, m, mm, c & cpp files. For header - # files it will include any header in the folder. - # Not including the public_header_files will make all headers public. - # - - s.source_files = "TGPControls/**/*.{swift}" - s.exclude_files = "TGPControlsDemo7/*", "TGPControlsDemo/*" + spec.source = { :git => "https://github.com/SwiftArchitect/TGPControls.git", :tag => "v3.0.0" } + spec.source_files = "TGPControls/**/*.{swift}" + spec.exclude_files = "TGPControlsDemo7/*", "TGPControlsDemo/*" # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Link your library with frameworks, or libraries. Libraries do not include - # the lib prefix of their name. - # - - s.framework = "UIKit" - # s.framework = "SomeFramework" - # s.frameworks = "SomeFramework", "AnotherFramework" - - # s.library = "iconv" - # s.libraries = "iconv", "xml2" - - - # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # If your library depends on compiler flags you can set them in the xcconfig hash - # where they will only apply to your library. If you depend on other Podspecs - # you can include multiple dependencies to ensure it works. - - # s.requires_arc = true - - # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } - # s.dependency "JSONKit", "~> 1.4" - + spec.framework = "UIKit" end From 2f7887bcf54672b4124e44a3d0ed31a4e0215e7e Mon Sep 17 00:00:00 2001 From: Xavier Schott Date: Mon, 13 Feb 2017 22:19:49 -0800 Subject: [PATCH 5/5] License --- TGPControls_License.txt => LICENSE | 0 TGPControls.podspec | 111 +++++------------------------ 2 files changed, 16 insertions(+), 95 deletions(-) rename TGPControls_License.txt => LICENSE (100%) diff --git a/TGPControls_License.txt b/LICENSE similarity index 100% rename from TGPControls_License.txt rename to LICENSE diff --git a/TGPControls.podspec b/TGPControls.podspec index dcc33fb..72ce11c 100644 --- a/TGPControls.podspec +++ b/TGPControls.podspec @@ -1,114 +1,35 @@ -# -# Be sure to run `pod spec lint TGPControls.podspec' to ensure this is a -# valid spec and to remove all comments including this before submitting the spec. -# -# To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html -# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ -# - -Pod::Spec.new do |s| +Pod::Spec.new do |spec| # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # These will help people to find your library, and whilst it - # can feel like a chore to fill in it's definitely to your advantage. The - # summary should be tweet-length, and the description more in depth. - # + spec.name = "TGPControls" + spec.version = "3.0.0" + spec.summary = "Custom Awesome iOS Controls: Animated discrete slider, animated labels" - s.name = "TGPControls" - s.version = "3.0.0" - s.summary = "Custom Awesome iOS Controls: Animated discrete slider, animated labels" - - s.description = <<-DESC + spec.description = <<-DESC Provide an iOS looking UISlider with discrete, controlable steps Provide dynamic, animated labels for discrete slider Entirely compatible with UISlider - DESC - - s.homepage = "https://github.com/SwiftArchitect/TGPControls" - s.screenshots = "https://cloud.githubusercontent.com/assets/4073988/5912371/144aaf24-a588-11e4-9a22-42832eb2c235.gif", "https://cloud.githubusercontent.com/assets/4073988/5912454/15774398-a589-11e4-8f08-18c9c7b59871.gif", "https://cloud.githubusercontent.com/assets/4073988/6628373/183c7452-c8c2-11e4-9a63-107805bc0cc4.gif", "https://cloud.githubusercontent.com/assets/4073988/5912297/c3f21bb2-a586-11e4-8eb1-a1f930ccbdd5.gif" - + spec.homepage = "https://github.com/SwiftArchitect/TGPControls" + spec.screenshots = "https://cloud.githubusercontent.com/assets/4073988/5912371/144aaf24-a588-11e4-9a22-42832eb2c235.gif", "https://cloud.githubusercontent.com/assets/4073988/5912454/15774398-a589-11e4-8f08-18c9c7b59871.gif", "https://cloud.githubusercontent.com/assets/4073988/6628373/183c7452-c8c2-11e4-9a63-107805bc0cc4.gif", "https://cloud.githubusercontent.com/assets/4073988/5912297/c3f21bb2-a586-11e4-8eb1-a1f930ccbdd5.gif" # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Licensing your code is important. See http://choosealicense.com for more info. - # CocoaPods will detect a license file if there is a named LICENSE* - # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. - # - - s.license = { :type => "MIT", :file => "TGPControls_License.txt" } - + spec.license = { :type => "MIT", :file => "LICENSE" } # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Specify the authors of the library, with email addresses. Email addresses - # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also - # accepts just a name if you'd rather not provide an email address. - # - # Specify a social_media_url where others can refer to, for example a twitter - # profile URL. - # - - s.author = { "Xavier Schott" => "http://swiftarchitect.com/swiftarchitect/" } - #s.social_media_url = "https://twitter.com/swiftarchitect" - + spec.author = { "Xavier Schott" => "http://swiftarchitect.com/swiftarchitect/" } # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # If this Pod runs only on iOS or OS X, then specify the platform and - # the deployment target. You can optionally include the target after the platform. - # - - s.platform = :ios - s.ios.deployment_target = '8.0' - s.requires_arc = true - + spec.platform = :ios + spec.ios.deployment_target = '8.0' + spec.requires_arc = true # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Specify the location from where the source should be retrieved. - # Supports git, hg, bzr, svn and HTTP. - # - - s.source = { :git => "https://github.com/SwiftArchitect/TGPControls.git", :tag => "v3.0.0" } - - - # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # CocoaPods is smart about how it includes source code. For source files - # giving a folder will include any h, m, mm, c & cpp files. For header - # files it will include any header in the folder. - # Not including the public_header_files will make all headers public. - # - - s.source_files = "TGPControls/**/*.{swift}" - s.exclude_files = "TGPControlsDemo7/*", "TGPControlsDemo/*" + spec.source = { :git => "https://github.com/SwiftArchitect/TGPControls.git", :tag => "v3.0.0" } + spec.source_files = "TGPControls/**/*.{swift}" + spec.exclude_files = "TGPControlsDemo7/*", "TGPControlsDemo/*" # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # Link your library with frameworks, or libraries. Libraries do not include - # the lib prefix of their name. - # - - s.framework = "UIKit" - # s.framework = "SomeFramework" - # s.frameworks = "SomeFramework", "AnotherFramework" - - # s.library = "iconv" - # s.libraries = "iconv", "xml2" - - - # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - # - # If your library depends on compiler flags you can set them in the xcconfig hash - # where they will only apply to your library. If you depend on other Podspecs - # you can include multiple dependencies to ensure it works. - - # s.requires_arc = true - - # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } - # s.dependency "JSONKit", "~> 1.4" - + spec.framework = "UIKit" end