diff --git a/REDRangeSlider/REDRangeSlider/REDRangeSlider.h b/REDRangeSlider/REDRangeSlider/REDRangeSlider.h index 9071441..6c3fd6e 100644 --- a/REDRangeSlider/REDRangeSlider/REDRangeSlider.h +++ b/REDRangeSlider/REDRangeSlider/REDRangeSlider.h @@ -15,6 +15,8 @@ @property (assign, nonatomic) CGFloat maxValue; @property (assign, nonatomic) CGFloat leftValue; @property (assign, nonatomic) CGFloat rightValue; +@property (assign, nonatomic) CGFloat rawLeftValue; +@property (assign, nonatomic) CGFloat rawRightValue; @property (strong, nonatomic) UIImage *handleImage; @property (strong, nonatomic) UIImage *leftHandleImage; diff --git a/REDRangeSlider/REDRangeSlider/REDRangeSlider.m b/REDRangeSlider/REDRangeSlider/REDRangeSlider.m index 4f713cf..ff27970 100644 --- a/REDRangeSlider/REDRangeSlider/REDRangeSlider.m +++ b/REDRangeSlider/REDRangeSlider/REDRangeSlider.m @@ -210,7 +210,9 @@ - (UIImage *)rightHandleHighlightedImage { - (UIImage *)trackBackgroundImage { if(!_trackBackgroundImage) { - UIImage *image = [[UIImage imageNamed:@"slider-track-background"] resizableImageWithCapInsets:UIEdgeInsetsMake(4, 5, 4, 5)]; + UIImage *image = ([UIImage instancesRespondToSelector:@selector(resizableImageWithCapInsets:)]) + ? [[UIImage imageNamed:@"slider-track-background"] resizableImageWithCapInsets:UIEdgeInsetsMake(4, 5, 4, 5)] // iOS5+ + : [[UIImage imageNamed:@"slider-track-background"] stretchableImageWithLeftCapWidth:5 topCapHeight:4]; // Same result, pre-iOS5 (deprecated from iOS5) _trackBackgroundImage = image; } return _trackBackgroundImage; @@ -218,7 +220,9 @@ - (UIImage *)trackBackgroundImage { - (UIImage *)trackFillImage { if(!_trackFillImage) { - UIImage *image = [[UIImage imageNamed:@"slider-track-fill"] resizableImageWithCapInsets:UIEdgeInsetsMake(4, 5, 4, 5)]; + UIImage *image = ([UIImage instancesRespondToSelector:@selector(resizableImageWithCapInsets:)]) + ? [[UIImage imageNamed:@"slider-track-fill"] resizableImageWithCapInsets:UIEdgeInsetsMake(4, 5, 4, 5)] // iOS5+ + : [[UIImage imageNamed:@"slider-track-fill"] stretchableImageWithLeftCapWidth:5 topCapHeight:4]; // Same result, pre-iOS5 (deprecated from iOS5) _trackFillImage = image; } return _trackFillImage; @@ -254,6 +258,7 @@ - (void)leftHandlePanEngadged:(UIGestureRecognizer *)gesture { if (panGesture.state == UIGestureRecognizerStateBegan) { self.leftHandle.highlighted = YES; + self.rawLeftValue = self.leftValue; } else if (panGesture.state == UIGestureRecognizerStateChanged) { @@ -262,8 +267,9 @@ - (void)leftHandlePanEngadged:(UIGestureRecognizer *)gesture { CGFloat trackOneHundredPercent = self.trackWidth-self.handleImage.size.width; CGFloat trackPercentageChange = (pointInView.x / trackOneHundredPercent)*100; - - self.leftValue += (trackPercentageChange/100.0) * oneHundredPercentOfValues; + + self.rawLeftValue += (trackPercentageChange/100.0) * oneHundredPercentOfValues; + self.leftValue = self.rawLeftValue; [panGesture setTranslation:CGPointZero inView:self]; [self sendActionsForControlEvents:UIControlEventValueChanged]; @@ -283,6 +289,7 @@ - (void)rightHandlePanEngadged:(UIGestureRecognizer *)gesture { if (panGesture.state == UIGestureRecognizerStateBegan) { self.rightHandle.highlighted = YES; + self.rawRightValue = self.rightValue; } if (panGesture.state == UIGestureRecognizerStateChanged) { @@ -292,7 +299,8 @@ - (void)rightHandlePanEngadged:(UIGestureRecognizer *)gesture { CGFloat trackOneHundredPercent = self.trackWidth-self.handleImage.size.width; CGFloat trackPercentageChange = (pointInView.x / trackOneHundredPercent)*100; - self.rightValue += (trackPercentageChange/100.0) * oneHundredPercentOfValues; + self.rawRightValue += (trackPercentageChange/100.0) * oneHundredPercentOfValues; + self.rightValue = self.rawRightValue; [panGesture setTranslation:CGPointZero inView:self]; [self sendActionsForControlEvents:UIControlEventValueChanged]; diff --git a/REDRangeSlider/REDViewController.h b/REDRangeSlider/REDViewController.h index b0ff0a7..15ee580 100644 --- a/REDRangeSlider/REDViewController.h +++ b/REDRangeSlider/REDViewController.h @@ -13,5 +13,8 @@ @property (weak, nonatomic) IBOutlet UILabel *leftValueLabel; @property (weak, nonatomic) IBOutlet UILabel *rightValueLabel; +@property (weak, nonatomic) IBOutlet UISegmentedControl *restrictionSegmentedControl; + +- (IBAction)segmentedControlChanged:(id)sender; @end diff --git a/REDRangeSlider/REDViewController.m b/REDRangeSlider/REDViewController.m index 2b16256..b51f0ea 100644 --- a/REDRangeSlider/REDViewController.m +++ b/REDRangeSlider/REDViewController.m @@ -29,6 +29,8 @@ - (void)viewDidLoad { self.rangeSlider = [[REDRangeSlider alloc] initWithFrame:CGRectMake(0, 0, 200, 20)]; self.rangeSlider.center = self.view.center; [self.rangeSlider addTarget:self action:@selector(rangeSliderValueChanged:) forControlEvents:UIControlEventValueChanged]; + self.rangeSlider.minValue = 0.0; + self.rangeSlider.maxValue = 20.0; [self.view addSubview:self.rangeSlider]; [self updateSliderLabels]; @@ -43,9 +45,24 @@ - (void)didReceiveMemoryWarning { - (void)rangeSliderValueChanged:(id)sender { + switch (self.restrictionSegmentedControl.selectedSegmentIndex) { + case 1: + self.rangeSlider.leftValue = roundf(self.rangeSlider.leftValue); + self.rangeSlider.rightValue = roundf(self.rangeSlider.rightValue); + break; + case 2: + self.rangeSlider.rightValue = self.rangeSlider.maxValue - self.rangeSlider.minValue - self.rangeSlider.leftValue; + break; + } + [self updateSliderLabels]; } +- (void)segmentedControlChanged:(id)sender { + [self rangeSliderValueChanged:sender]; +} + + #pragma mark - - (void)updateSliderLabels { diff --git a/REDRangeSlider/en.lproj/REDViewController.xib b/REDRangeSlider/en.lproj/REDViewController.xib index cb9853f..9c22d36 100644 --- a/REDRangeSlider/en.lproj/REDViewController.xib +++ b/REDRangeSlider/en.lproj/REDViewController.xib @@ -14,6 +14,7 @@ IBNSLayoutConstraint IBProxyObject IBUILabel + IBUISegmentedControl IBUIView @@ -74,7 +75,7 @@ {{228, 20}, {72, 21}} - + _NS:9 NO YES @@ -89,6 +90,44 @@ NO + + + 292 + {{10, 360}, {300, 30}} + + + _NS:9 + NO + IBCocoaTouchFramework + 2 + 3 + 0 + + Unrestricted + Integers + Mirrored right + + + + + + + + + + + + + {0, 0} + {0, 0} + {0, 0} + + + + + + + {{0, 20}, {320, 548}} @@ -149,6 +188,23 @@ 24 + + + restrictionSegmentedControl + + + + 40 + + + + segmentedControlChanged: + + + 13 + + 54 + @@ -173,6 +229,38 @@ 6 + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + 4 + 0 + + 4 + 1 + + 159 + + 1000 + + 3 + 9 + 3 + 6 @@ -255,6 +343,7 @@ + @@ -362,6 +451,44 @@ + + 36 + + + + + 7 + 0 + + 0 + 1 + + 300 + + 1000 + + 3 + 9 + 1 + + + + + + 50 + + + + + 52 + + + + + 53 + + + @@ -382,6 +509,15 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -389,6 +525,8 @@ + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -401,7 +539,7 @@ - 35 + 54 @@ -416,8 +554,20 @@ REDViewController UIViewController + + segmentedControlChanged: + id + + + segmentedControlChanged: + + segmentedControlChanged: + id + + UILabel + UISegmentedControl UILabel @@ -425,6 +575,10 @@ leftValueLabel UILabel + + restrictionSegmentedControl + UISegmentedControl + rightValueLabel UILabel