Created
May 26, 2012 22:11
-
-
Save troystribling/2795476 to your computer and use it in GitHub Desktop.
UIPanGesture Slider Control
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <UIKit/UIKit.h> | |
@protocol ParameterSliderViewDelegate; | |
@interface ParameterSliderView : UIView | |
@property(nonatomic, weak) id<ParameterSliderViewDelegate> delegate; | |
@property(nonatomic, strong) UIView* parameterView; | |
@property(nonatomic, strong) UIView* parameterViewBorder; | |
@property(nonatomic, strong) UIPanGestureRecognizer* panGesture; | |
@property(nonatomic, assign) CGFloat maxValue; | |
@property(nonatomic, assign) CGFloat minValue; | |
@property(nonatomic, assign) CGFloat initialValue; | |
@property(nonatomic, assign) CGRect parameterViewFrame; | |
- (CGFloat)value; | |
- (void)setIntialValue; | |
@end | |
@protocol ParameterSliderViewDelegate | |
-(void)parameterSliderValueChanged:(ParameterSliderView*)_parameterSlider; | |
@end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "ParameterSliderView.h" | |
#import <QuartzCore/QuartzCore.h> | |
#define PARAMETER_VIEW_HEIGHT_SCALE 0.5 | |
#define DEFAULT_MIN_VALUE 0.0 | |
#define DEFAULT_MAX_VALUE 1.0 | |
#define DEFAULT_INITIAL_VALUE 0.5 | |
@interface ParameterSliderView (PrivateAPI) | |
- (void)valueChanged; | |
- (void)drawParameterViewBorder; | |
- (void)addSubviews; | |
@end | |
@implementation ParameterSliderView | |
@synthesize delegate, parameterView, parameterViewBorder, panGesture, maxValue, minValue, initialValue, parameterViewFrame; | |
#pragma mark - | |
#pragma mark ParameterSlider PrivateAPI | |
- (void)valueChanged:(UIPanGestureRecognizer*)_panGesture { | |
CGPoint dragDelta = [_panGesture translationInView:self]; | |
CGFloat newWidth = self.parameterViewFrame.size.width + dragDelta.x; | |
if (newWidth < 0.0) { | |
newWidth = 0.0; | |
} else if (newWidth > self.frame.size.width) { | |
newWidth = self.frame.size.width; | |
} | |
switch (_panGesture.state) { | |
case UIGestureRecognizerStateBegan: | |
case UIGestureRecognizerStateChanged: | |
self.parameterView.frame = CGRectMake(0.0, self.parameterViewFrame.origin.y, newWidth, self.parameterViewFrame.size.height); | |
break; | |
case UIGestureRecognizerStateEnded: | |
self.parameterViewFrame = self.parameterView.frame; | |
[self.delegate parameterSliderValueChanged:self]; | |
break; | |
default: | |
break; | |
} | |
} | |
- (void)addSubviews { | |
self.panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(valueChanged:)]; | |
[self addGestureRecognizer:self.panGesture]; | |
self.parameterViewFrame = CGRectMake(0.0, 0.5 * self.frame.size.height * (1.0 - PARAMETER_VIEW_HEIGHT_SCALE), 0.5 * self.frame.size.width, PARAMETER_VIEW_HEIGHT_SCALE * self.frame.size.height); | |
self.parameterView = [[UIView alloc] initWithFrame:self.parameterViewFrame]; | |
self.parameterView.backgroundColor = [UIColor whiteColor]; | |
[self addSubview:self.parameterView]; | |
self.parameterViewBorder = [[UIView alloc] initWithFrame:CGRectMake(-1.0, self.parameterView.frame.origin.y - 1.0, self.frame.size.width + 2.0, self.parameterView.frame.size.height + 2.0)]; | |
[self addSubview:self.parameterViewBorder]; | |
self.backgroundColor = [UIColor clearColor]; | |
self.initialValue = self.initialValue; | |
self.parameterViewBorder.layer.borderColor = [UIColor whiteColor].CGColor; | |
self.parameterViewBorder.layer.borderWidth = 1.0f; | |
} | |
#pragma mark - | |
#pragma mark ParameterSlider | |
+ (id)withFrame:(CGRect)_frame { | |
ParameterSliderView* sliderView = [[ParameterSliderView alloc] initWithFrame:_frame]; | |
return sliderView; | |
} | |
- (id)initWithCoder:(NSCoder*)coder { | |
self = [super initWithCoder:coder]; | |
if (self) { | |
[self addSubviews]; | |
} | |
return self; | |
} | |
- (id)initWithFrame:(CGRect)_frame { | |
self = [super initWithFrame:_frame]; | |
if (self) { | |
[self addSubviews]; | |
} | |
return self; | |
} | |
- (void)setIntialValue { | |
self.parameterView.frame = CGRectMake(0.0, | |
0.5 * self.frame.size.height * (1.0 - PARAMETER_VIEW_HEIGHT_SCALE), | |
(self.initialValue - self.minValue) / (self.maxValue - self.minValue) * self.frame.size.width, | |
PARAMETER_VIEW_HEIGHT_SCALE * self.frame.size.height); | |
self.parameterViewFrame = self.parameterView.frame; | |
} | |
- (CGFloat)value { | |
CGFloat parameterWidth = self.parameterViewFrame.size.width / self.frame.size.width; | |
return parameterWidth * (self.maxValue - self.minValue) + self.minValue; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment