From 5c45e17d94cc12cfdb1323fad4d384f449b92559 Mon Sep 17 00:00:00 2001 From: pjebs Date: Tue, 28 Jun 2016 15:11:35 +1000 Subject: [PATCH] Added UISegmentedControlNoSegment for selectedSegmentIndex property. - Now the control can be a replacement for UISegmentedControl --- NYSegmentedControl.podspec | 2 +- NYSegmentedControl/NYSegmentedControl.h | 4 +- NYSegmentedControl/NYSegmentedControl.m | 62 +++++++++++++------ .../DemoViewController.m | 1 + 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/NYSegmentedControl.podspec b/NYSegmentedControl.podspec index e082a49..b78b0c1 100644 --- a/NYSegmentedControl.podspec +++ b/NYSegmentedControl.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "NYSegmentedControl" - s.version = "1.0.7" + s.version = "1.0.8" s.summary = "Animated, customizable replacement for UISegmentedControl" s.description = "NYSegmentedControl is a customizable, animated replacement for UISegmentedControl inspired by controls found in Instagram, Foursquare, and other apps." s.homepage = "https://github.com/nealyoung/NYSegmentedControl" diff --git a/NYSegmentedControl/NYSegmentedControl.h b/NYSegmentedControl/NYSegmentedControl.h index b3e3ac9..6d72e26 100644 --- a/NYSegmentedControl/NYSegmentedControl.h +++ b/NYSegmentedControl/NYSegmentedControl.h @@ -142,7 +142,7 @@ /** The index of the currently selected segment */ -@property (nonatomic) NSUInteger selectedSegmentIndex; +@property (nonatomic) NSInteger selectedSegmentIndex; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0 @@ -226,7 +226,7 @@ @param selectedSegmentIndex The index of the segment to select. It must be a number between 0 and the number of segments (numberOfSegments) minus 1; values exceeding this upper range are pinned to it. @param animated Specify YES if the selected segment indicator should animate its position change. */ -- (void)setSelectedSegmentIndex:(NSUInteger)selectedSegmentIndex animated:(BOOL)animated; +- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex animated:(BOOL)animated; /** Reloads the control's items from its data source, if defined diff --git a/NYSegmentedControl/NYSegmentedControl.m b/NYSegmentedControl/NYSegmentedControl.m index 50dbcd4..7626642 100644 --- a/NYSegmentedControl/NYSegmentedControl.m +++ b/NYSegmentedControl/NYSegmentedControl.m @@ -18,7 +18,7 @@ @interface NYSegmentedControl () @property NYSegmentIndicator *selectedSegmentIndicator; @property (nonatomic, getter=isAnimating) BOOL animating; -- (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSUInteger)index animated:(BOOL)animated; +- (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSInteger)index animated:(BOOL)animated; - (CGRect)indicatorFrameForSegment:(NYSegment *)segment; - (void)panGestureRecognized:(UIPanGestureRecognizer *)panGestureRecognizer; @@ -188,7 +188,9 @@ - (void)layoutSubviews { } } - self.selectedSegmentIndicator.frame = [self indicatorFrameForSegment:self.segments[self.selectedSegmentIndex]]; + if (self.selectedSegmentIndex != UISegmentedControlNoSegment) { + self.selectedSegmentIndicator.frame = [self indicatorFrameForSegment:self.segments[self.selectedSegmentIndex]]; + } } - (void)drawRect:(CGRect)rect { @@ -251,22 +253,32 @@ - (NSString *)titleForSegmentAtIndex:(NSUInteger)index { return segment.titleLabel.text; } -- (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSUInteger)index animated:(BOOL)animated { +- (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSInteger)index animated:(BOOL)animated { + if (index == UISegmentedControlNoSegment) { + //Hide segment indicator + self.selectedSegmentIndicator.hidden = YES; + return; + } else { + self.selectedSegmentIndicator.hidden = NO; + } + NYSegment *selectedSegment = self.segments[index]; // If we're moving the indicator back to the originally selected segment, don't change the segment's font style if (index != self.selectedSegmentIndex && self.stylesTitleForSelectedSegment) { - NYSegment *previousSegment = self.segments[self.selectedSegmentIndex]; - - [UIView transitionWithView:previousSegment.titleLabel - duration:self.segmentIndicatorAnimationDuration - options:UIViewAnimationOptionTransitionCrossDissolve - animations:^{ - previousSegment.titleLabel.font = self.titleFont; - previousSegment.titleLabel.textColor = self.titleTextColor; - previousSegment.titleLabel.maskFrame = CGRectZero; - } - completion:nil]; + if (self.selectedSegmentIndex != UISegmentedControlNoSegment) { + NYSegment *previousSegment = self.segments[self.selectedSegmentIndex]; + + [UIView transitionWithView:previousSegment.titleLabel + duration:self.segmentIndicatorAnimationDuration + options:UIViewAnimationOptionTransitionCrossDissolve + animations:^{ + previousSegment.titleLabel.font = self.titleFont; + previousSegment.titleLabel.textColor = self.titleTextColor; + previousSegment.titleLabel.maskFrame = CGRectZero; + } + completion:nil]; + } [UIView transitionWithView:selectedSegment.titleLabel duration:self.segmentIndicatorAnimationDuration @@ -282,6 +294,10 @@ - (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSUInteger)index animated: completion:nil]; } + if (_selectedSegmentIndex == UISegmentedControlNoSegment) { + self.selectedSegmentIndicator.frame = [self indicatorFrameForSegment:selectedSegment]; + } + if (animated) { void (^animationsBlock)(void) = ^{ self.selectedSegmentIndicator.frame = [self indicatorFrameForSegment:selectedSegment]; @@ -295,6 +311,7 @@ - (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSUInteger)index animated: } }; + [self.selectedSegmentIndicator setNeedsDisplay]; if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1 || !self.usesSpringAnimations) { [UIView animateWithDuration:self.segmentIndicatorAnimationDuration animations:animationsBlock @@ -309,6 +326,7 @@ - (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSUInteger)index animated: completion:nil]; } } else { + [self.selectedSegmentIndicator setNeedsDisplay]; self.selectedSegmentIndicator.frame = [self indicatorFrameForSegment:selectedSegment]; if (self.stylesTitleForSelectedSegment) { @@ -516,18 +534,26 @@ - (void)setSelectedTitleTextColor:(UIColor *)selectedTitleTextColor { [self setNeedsLayout]; } -- (void)setSelectedSegmentIndex:(NSUInteger)selectedSegmentIndex { - if (selectedSegmentIndex >= self.numberOfSegments) { +- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex { + if (selectedSegmentIndex >= (NSInteger)self.numberOfSegments) { selectedSegmentIndex = self.numberOfSegments - 1; + } else if (selectedSegmentIndex < 0) { + if (selectedSegmentIndex != UISegmentedControlNoSegment) { + selectedSegmentIndex = 0; + } } [self moveSelectedSegmentIndicatorToSegmentAtIndex:selectedSegmentIndex animated:NO]; _selectedSegmentIndex = selectedSegmentIndex; } -- (void)setSelectedSegmentIndex:(NSUInteger)selectedSegmentIndex animated:(BOOL)animated { - if (selectedSegmentIndex >= self.numberOfSegments) { +- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex animated:(BOOL)animated { + if (selectedSegmentIndex >= (NSInteger)self.numberOfSegments) { selectedSegmentIndex = self.numberOfSegments - 1; + } else if (selectedSegmentIndex < 0) { + if (selectedSegmentIndex != UISegmentedControlNoSegment) { + selectedSegmentIndex = 0; + } } [self moveSelectedSegmentIndicatorToSegmentAtIndex:selectedSegmentIndex animated:animated]; diff --git a/NYSegmentedControlDemo/NYSegmentedControlDemo/DemoViewController.m b/NYSegmentedControlDemo/NYSegmentedControlDemo/DemoViewController.m index bbedc90..f727637 100644 --- a/NYSegmentedControlDemo/NYSegmentedControlDemo/DemoViewController.m +++ b/NYSegmentedControlDemo/NYSegmentedControlDemo/DemoViewController.m @@ -86,6 +86,7 @@ - (void)viewDidLoad { #endif foursquareSegmentedControl.center = CGPointMake(lightControlExampleView.center.x, lightControlExampleView.center.y + 30.0f); foursquareSegmentedControlBackgroundView.center = foursquareSegmentedControl.center; + foursquareSegmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment; [lightControlExampleView addSubview:foursquareSegmentedControl]; UIView *darkControlExampleView = [[UIView alloc] initWithFrame:self.view.bounds];