Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion NYSegmentedControl.podspec
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
4 changes: 2 additions & 2 deletions NYSegmentedControl/NYSegmentedControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
62 changes: 44 additions & 18 deletions NYSegmentedControl/NYSegmentedControl.m
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand All @@ -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];
Expand All @@ -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
Expand All @@ -309,6 +326,7 @@ - (void)moveSelectedSegmentIndicatorToSegmentAtIndex:(NSUInteger)index animated:
completion:nil];
}
} else {
[self.selectedSegmentIndicator setNeedsDisplay];
self.selectedSegmentIndicator.frame = [self indicatorFrameForSegment:selectedSegment];

if (self.stylesTitleForSelectedSegment) {
Expand Down Expand Up @@ -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];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down