From 5509c8bcb94eb0e48ee80a506b7343b6d9cfcbea Mon Sep 17 00:00:00 2001 From: Daniel Blakemore Date: Thu, 5 Jun 2014 15:01:57 -0600 Subject: [PATCH 1/2] Added style presets for iOS 7, updated the demo project, and documented the header files with xcode doxygen-like comments --- Demo/1.png | Bin 0 -> 3322 bytes Demo/1@2x.png | Bin 0 -> 4076 bytes Demo/2.png | Bin 0 -> 3303 bytes Demo/2@2x.png | Bin 0 -> 3957 bytes Demo/3.png | Bin 0 -> 3399 bytes Demo/3@2x.png | Bin 0 -> 4196 bytes Demo/Classes/ViewController.m | 40 ++++- .../project.pbxproj | 24 +++ SVSegmentedControl/SVSegmentedControl.h | 162 ++++++++++++++++++ SVSegmentedControl/SVSegmentedControl.m | 90 ++++++++-- SVSegmentedControl/SVSegmentedThumb.h | 33 ++++ 11 files changed, 328 insertions(+), 21 deletions(-) create mode 100644 Demo/1.png create mode 100644 Demo/1@2x.png create mode 100644 Demo/2.png create mode 100644 Demo/2@2x.png create mode 100644 Demo/3.png create mode 100644 Demo/3@2x.png diff --git a/Demo/1.png b/Demo/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d80af49a316878815f15a6841bc3a7194e79ff GIT binary patch literal 3322 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 literal 0 HcmV?d00001 diff --git a/Demo/1@2x.png b/Demo/1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ac64791ffb3d0acd7bb9614607a514464233770b GIT binary patch literal 4076 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 dL&C;!?LWsQoXX+uL$Nkc;* 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 +/** + * Default initial styles to enable or disable multiple visual attributes at once. + */ +typedef NS_ENUM(NSInteger, SVSegmentedControlStylePreset) +{ + /** + * The default style used when nothing is set. Shadows and gradient are intact. + */ + SVSegmentedControlStylePresetDefault, + /** + * A flat style to match iOS 7+ style layouts. All shadows and gradient disabled. + */ + SVSegmentedControlStylePresetFlat, +}; + @protocol SVSegmentedControlDelegate; +/** + * SVSegmentedControl is a customizable UIControl class that mimics UISegmentedControl but that looks like an UISwitch. + * In its simplest form, this is how you create an SVSegmentedControl instance: + * @code + segmentedControl = [[SVSegmentedControl alloc] initWithSectionTitles:[NSArray arrayWithObjects:@"Section 1", @"Section 2", nil]]; + segmentedControl.changeHandler = ^(NSUInteger newIndex) { + // respond to index change + }; + + [self.view addSubview:segmentedControl]; + * @endcode + * You can position it using either its frame or center property: + */ @interface SVSegmentedControl : UIControl +/** + * A block called whenever there is a change to the switch. + * If you haven't fallen in love with blocks yet, you can still use the classic UIControl method: + * @code +[mySegmentedControl addTarget:self action:@selector(segmentedControlChangedValue:) forControlEvents:UIControlEventValueChanged]; + * @endcode + * + * Providing an action method ending with a semicolon, the sender object is therefore made accessible: + * @code +- (void)segmentedControlChangedValue:(SVSegmentedControl*)segmentedControl { + NSLog(@"segmentedControl did select index %i", segmentedControl.selectedIndex); +} + * @endcode + */ @property (nonatomic, copy) void (^changeHandler)(NSUInteger newIndex); // you can also use addTarget:action:forControlEvents: + +/** + * The titles for each section of the switch. These are laid out in the order specicied in the array. + */ @property (nonatomic, copy) NSArray *sectionTitles; + +/** + * Images placed to the left of section titles. Images are assigned to titles with corresponding indices. + * If not enough images are provided, the remaining section(s) will be displayed normally. + * If too many images are provided, the remaining images are not displayed. + */ @property (nonatomic, copy) NSArray *sectionImages; +/** + * The thumb that moves to the selected section. Access this property to change its appearance. + */ @property (nonatomic, strong, readonly) SVSegmentedThumb *thumb; + +/** + * The currently selected index of the switch. The default value is 0. + */ @property (nonatomic, readonly) NSUInteger selectedSegmentIndex; // default is 0 + +/** + * Whether or not to animated the change to initial selection. The default value is NO. + * @remarks This doesn't seem to be used anywhere. + */ @property (nonatomic, readwrite) BOOL animateToInitialSelection; // default is NO + +/** + * Whether or not to change the title on the thumb, or slide the thumb over the titles. + * If set to NO (the default) the thumb moves while the old and new titles stay lined up with the titles + * in the background, sliding on and off the thumb. + * If set to YES, as the thumb moves, the title stays in place and fades between the two sections. + */ @property (nonatomic, readwrite) BOOL crossFadeLabelsOnDrag; // default is NO +/** + * Whether the switch must be changed with a pan gesture to make the control difficult to accidentally change. + * The default is NO. + */ @property (nonatomic, readwrite) BOOL mustSlideToChange; // default is NO - To make the control difficult to accidentally change, force the user to slide it + +/** + * The fractional amount by which the thumb must overlap a destination segment to cause a snap to that segment. + * The default value is 0.66. + */ @property (nonatomic, readwrite) CGFloat minimumOverlapToChange; // default is 0.66 - Only snap to a new segment if the thumb overlaps it by this fraction + +/** + * Margins to add to the touchable area of the control. + * The default is UIEdgeInsetsMake(0, 0, 0, 0). + */ @property (nonatomic, readwrite) UIEdgeInsets touchTargetMargins; // default is UIEdgeInsetsMake(0, 0, 0, 0) - Enlarge touch target of control +/** + * The color used in the background of the switch. + * The default is [UIColor colorWithWhite:0.1 alpha:1]. + */ @property (nonatomic, strong) UIColor *backgroundTintColor; // default is [UIColor colorWithWhite:0.1 alpha:1] + +/** + * The image used in the background of the switch. + * The default is nil. + */ @property (nonatomic, strong) UIImage *backgroundImage; // default is nil +/** + * The height of the control. The default is 32.0. + */ @property (nonatomic, readwrite) CGFloat height; // default is 32.0 + +/** + * The insets of the thumb from the boundries of the segment and the control. + * The default is UIEdgeInsetsMake(2, 2, 3, 2). + */ @property (nonatomic, readwrite) UIEdgeInsets thumbEdgeInset; // default is UIEdgeInsetsMake(2, 2, 3, 2) + +/** + * The insets from the edge of the control to the edges of the segment titles. + * The default is UIEdgeInsetsMake(0, 10, 0, 10). + */ @property (nonatomic, readwrite) UIEdgeInsets titleEdgeInsets; // default is UIEdgeInsetsMake(0, 10, 0, 10) + +/** + * The corner radius of the control. The default is 4.0. + */ @property (nonatomic, readwrite) CGFloat cornerRadius; // default is 4.0 +/** + * The font used for the titles. The default is [UIFont boldSystemFontOfSize:15]. + */ @property (nonatomic, strong) UIFont *font; // default is [UIFont boldSystemFontOfSize:15] + +/** + * The color of the text in the segments that are not selected. The default is [UIColor grayColor]. + */ @property (nonatomic, strong) UIColor *textColor; // default is [UIColor grayColor]; + +/** + * The color of the shadow for the text in the segments that are not selected. The default is [UIColor blackColor]. + */ @property (nonatomic, strong) UIColor *textShadowColor; // default is [UIColor blackColor] + +/** + * The offset of the shadow from the text in the segments that are not selected. The default is CGSizeMake(0, -1). + */ @property (nonatomic, readwrite) CGSize textShadowOffset; // default is CGSizeMake(0, -1) + +/** + * The color of the shadow inside the control along the edges. The default is [UIColor colorWithWhite:0 alpha:0.8]. + */ @property (nonatomic, strong) UIColor *innerShadowColor; // default is [UIColor colorWithWhite:0 alpha:0.8] +/** + * The preset style. Setting this will change all documented shadow colors, the thumb gradient, + * and remove the bottom gloss. The default value is SVSegmentedControlStylePresetDefault. + */ +@property (nonatomic, readwrite) SVSegmentedControlStylePreset stylePreset; + +/** + * Make a new segmented control with the specified section titles. + * Initialized with SVSegmentedControlStylePresetDefault. + * + * @param titlesArray an array of section titles for the new control + * + * @return a new segemented control with the specified titles + */ - (SVSegmentedControl*)initWithSectionTitles:(NSArray*)titlesArray; + +/** + * Make a new segmented control with the specified section titles and style. + * + * + * @param titlesArray an array of section titles for the new control + * @param style the initial styling preset for the control + * + * @return a new segmented control with the specified titles and style preset + */ +- (SVSegmentedControl*)initWithSectionTitles:(NSArray*)titlesArray stylePreset:(SVSegmentedControlStylePreset)stylePreset; + +/** + * Selects a specified index in the control. Either animates or jumps straight to the new state. + * + * @param index the new index to select + * @param animated whether to animate the change in selection + */ - (void)setSelectedSegmentIndex:(NSUInteger)index animated:(BOOL)animated; // deprecated diff --git a/SVSegmentedControl/SVSegmentedControl.m b/SVSegmentedControl/SVSegmentedControl.m index 4437107..d38e3f9 100644 --- a/SVSegmentedControl/SVSegmentedControl.m +++ b/SVSegmentedControl/SVSegmentedControl.m @@ -96,6 +96,31 @@ - (id)initWithSectionTitles:(NSArray*)array { return self; } +- (SVSegmentedControl*)initWithSectionTitles:(NSArray*)titlesArray stylePreset:(SVSegmentedControlStylePreset)stylePreset +{ + if (self = [self initWithSectionTitles:titlesArray]) { + _stylePreset = stylePreset; + + switch (_stylePreset) { + case SVSegmentedControlStylePresetFlat: + // remove shadows and gradient + self.textShadowColor = [UIColor clearColor]; + self.innerShadowColor = [UIColor clearColor]; + self.thumb.textShadowColor = [UIColor clearColor]; + self.thumb.shouldCastShadow = FALSE; + self.thumb.gradientIntensity = 0.0f; + break; + + case SVSegmentedControlStylePresetDefault: + default: + // do nothing + break; + } + } + + return self; +} + - (SVSegmentedThumb *)thumb { if(_thumb == nil) @@ -513,6 +538,32 @@ - (void)setThumbSecondValuesForIndex:(NSUInteger)index { image:[self sectionImage:[self imageForSectionIndex:index] withTintColor:self.thumb.textColor]]; } +- (void)setStylePreset:(SVSegmentedControlStylePreset)stylePreset +{ + _stylePreset = stylePreset; + + switch (_stylePreset) { + case SVSegmentedControlStylePresetFlat: + // remove shadows and gradient + self.textShadowColor = [UIColor clearColor]; + self.innerShadowColor = [UIColor clearColor]; + self.thumb.textShadowColor = [UIColor clearColor]; + self.thumb.shouldCastShadow = FALSE; + self.thumb.gradientIntensity = 0.0f; + break; + + case SVSegmentedControlStylePresetDefault: + default: + // do nothing + self.textShadowColor = [UIColor blackColor]; + self.innerShadowColor = [UIColor colorWithWhite:0 alpha:0.8]; + self.thumb.textShadowColor = [UIColor blackColor]; + self.thumb.shouldCastShadow = !!_backgroundImage; + self.thumb.gradientIntensity = 0.15f; + break; + } +} + #pragma mark - Deprecated methods - (void)setSelectedIndex:(NSUInteger)index { @@ -534,18 +585,19 @@ - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); - if(self.backgroundImage) + if(self.backgroundImage) { [self.backgroundImage drawInRect:rect]; - - else { - // bottom gloss - CGRect insetRect = CGRectMake(0, 0, rect.size.width, rect.size.height-1); - CGContextSetFillColorWithColor(context, [UIColor colorWithWhite:1 alpha:0.1].CGColor); - - UIBezierPath *bottomGlossPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:self.cornerRadius]; - [bottomGlossPath appendPath:[UIBezierPath bezierPathWithRoundedRect:insetRect cornerRadius:self.cornerRadius]]; - bottomGlossPath.usesEvenOddFillRule = YES; - [bottomGlossPath fill]; + } else { + CGRect insetRect = CGRectMake(0, 0, rect.size.width, rect.size.height-1);; + if (_stylePreset == SVSegmentedControlStylePresetDefault) { + // bottom gloss + CGContextSetFillColorWithColor(context, [UIColor colorWithWhite:1 alpha:0.1].CGColor); + + UIBezierPath *bottomGlossPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:self.cornerRadius]; + [bottomGlossPath appendPath:[UIBezierPath bezierPathWithRoundedRect:insetRect cornerRadius:self.cornerRadius]]; + bottomGlossPath.usesEvenOddFillRule = YES; + [bottomGlossPath fill]; + } CGPathRef roundedRect = [UIBezierPath bezierPathWithRoundedRect:insetRect cornerRadius:self.cornerRadius].CGPath; CGContextAddPath(context, roundedRect); @@ -576,13 +628,15 @@ - (void)drawRect:(CGRect)rect { CGGradientRelease(gradient); CGColorSpaceRelease(colorSpace); - // inner shadow - NSArray *paths = [NSArray arrayWithObject:[UIBezierPath bezierPathWithRoundedRect:insetRect cornerRadius:self.cornerRadius]]; - UIImage *mask = [self maskWithPaths:paths bounds:CGRectInset(insetRect, -10, -10)]; - UIImage *invertedImage = [self invertedImageWithMask:mask color:self.innerShadowColor]; - - CGContextSetShadowWithColor(context, CGSizeMake(0, 1), 2, self.innerShadowColor.CGColor); - [invertedImage drawAtPoint:CGPointMake(-10, -10)]; + if (_stylePreset == SVSegmentedControlStylePresetDefault) { + // inner shadow + NSArray *paths = [NSArray arrayWithObject:[UIBezierPath bezierPathWithRoundedRect:insetRect cornerRadius:self.cornerRadius]]; + UIImage *mask = [self maskWithPaths:paths bounds:CGRectInset(insetRect, -10, -10)]; + UIImage *invertedImage = [self invertedImageWithMask:mask color:self.innerShadowColor]; + + CGContextSetShadowWithColor(context, CGSizeMake(0, 1), 2, self.innerShadowColor.CGColor); + [invertedImage drawAtPoint:CGPointMake(-10, -10)]; + } } diff --git a/SVSegmentedControl/SVSegmentedThumb.h b/SVSegmentedControl/SVSegmentedThumb.h index 8f4877a..af488bd 100644 --- a/SVSegmentedControl/SVSegmentedThumb.h +++ b/SVSegmentedControl/SVSegmentedThumb.h @@ -14,14 +14,47 @@ @interface SVSegmentedThumb : UIView +/** + * The image to use in the background of the thumb. The default is nil. + * Setting this property, sets the valye of shouldCastShadow to NO. + */ @property (nonatomic, strong) UIImage *backgroundImage; // default is nil; + +/** + * The image used in the background when highlighted. The default is nil. + */ @property (nonatomic, strong) UIImage *highlightedBackgroundImage; // default is nil; +/** + * The color of the thumb used as a base for the gradient. The default is [UIColor grayColor]. + */ @property (nonatomic, strong) UIColor *tintColor; // default is [UIColor grayColor] + +/** + * The color the title text in the thumb. The default is [UIColor whiteColor]. + */ @property (nonatomic, strong) UIColor *textColor; // default is [UIColor whiteColor] + +/** + * The color of the shadow for the title text in the thumb. The default is [UIColor blackColor]. + */ @property (nonatomic, strong) UIColor *textShadowColor; // default is [UIColor blackColor] + +/** + * The offset of the shadow from the title text in the thumb. The default is CGSizeMake(0, -1). + */ @property (nonatomic, readwrite) CGSize textShadowOffset; // default is CGSizeMake(0, -1) + +/** + * Whether or not the thumb should cast a shadow on the rest of the control. The default is YES. + * This value is set to NO if the backgroundImage property is set to something other than nil. + */ @property (nonatomic, readwrite) BOOL shouldCastShadow; // default is YES (NO when backgroundImage is set) + +/** + * How much darker to make the second color in the gradient. Valid values range from 0 (no gradient) + * to 1 (gradient from tintColor to black). The default is 0.15. + */ @property (nonatomic, assign) CGFloat gradientIntensity; // default is 0.15 @end From ce12ac4ced264a3fe5d6803503b44c4379619bc2 Mon Sep 17 00:00:00 2001 From: Daniel Blakemore Date: Thu, 5 Jun 2014 20:02:19 -0600 Subject: [PATCH 2/2] missed one gradient --- SVSegmentedControl/SVSegmentedControl.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SVSegmentedControl/SVSegmentedControl.m b/SVSegmentedControl/SVSegmentedControl.m index d38e3f9..f679d12 100644 --- a/SVSegmentedControl/SVSegmentedControl.m +++ b/SVSegmentedControl/SVSegmentedControl.m @@ -617,7 +617,7 @@ - (void)drawRect:(CGRect)rect { CGFloat tintColorRGBA[4]; [tintColorToApply getRed:&tintColorRGBA[0] green:&tintColorRGBA[1] blue:&tintColorRGBA[2] alpha:&tintColorRGBA[3]]; - float darkeningDelta = 0.2; + float darkeningDelta = (_stylePreset == SVSegmentedControlStylePresetDefault) ? 0.2 : 0; // no gradient on flat UIColor *darkerTintColor = [UIColor colorWithRed:(tintColorRGBA[0] - darkeningDelta) green:(tintColorRGBA[1] - darkeningDelta) blue:(tintColorRGBA[2] - darkeningDelta) alpha:(tintColorRGBA[3] + darkeningDelta*0.2)]; CGFloat darkerTintColorRGBA[4]; [darkerTintColor getRed:&darkerTintColorRGBA[0] green:&darkerTintColorRGBA[1] blue:&darkerTintColorRGBA[2] alpha:&darkerTintColorRGBA[3]];