定制选择范围的按钮RangeButton
定制选择范围的按钮RangeButton
效果:
源码:
RangeButton.h 与 RangeButton.m
// // RangeButton.h // PulsingView // // Created by YouXianMing on 14/10/29. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> typedef void (^RangeButtonCenterLabel)(UILabel *label); @interface RangeButton : UIView /** * 最开始显示的值 */ @property (nonatomic, strong) NSNumber *startValue; /** * 每一次增加或者减少的值 */ @property (nonatomic, strong) NSNumber *stepValue; /** * 最大值 */ @property (nonatomic, strong) NSNumber *maxValue; /** * 最小值 */ @property (nonatomic, strong) NSNumber *minValue; /** * 左侧按钮的普通图片,高亮图片,不能点击时的图片 */ @property (nonatomic, strong) UIImage *leftNormalImage; @property (nonatomic, strong) UIImage *leftHighlightedImage; @property (nonatomic, strong) UIImage *leftDisableImage; /** * 右侧按钮的普通图片,高亮图片,不能点击时的图片 */ @property (nonatomic, strong) UIImage *rightNormalImage; @property (nonatomic, strong) UIImage *rightHighlightedImage; @property (nonatomic, strong) UIImage *rightDisableImage; /** * 当前值 */ @property (nonatomic, strong, readonly) NSNumber *currentValue; /** * 定制label * * @param block 中间的label */ - (void)configCenterLabel:(RangeButtonCenterLabel)block; /** * 设置按钮的宽度(重置3个控件的frame值) */ @property (nonatomic, assign) CGFloat buttonWidth; @end
// // RangeButton.m // PulsingView // // Created by YouXianMing on 14/10/29. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "RangeButton.h" @interface RangeButton () @property (nonatomic, strong) UIButton *leftButton; @property (nonatomic, strong) UIButton *rightButton; @property (nonatomic, strong) UILabel *centerLabel; @property (nonatomic, strong) NSNumber *currentValue; @end @implementation RangeButton - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { CGFloat width = frame.size.width / 3.f; CGFloat height = frame.size.height; // 左侧按钮 _leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, width, height)]; [_leftButton addTarget:self action:@selector(buttonsEvent:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_leftButton]; // 中间Label _centerLabel = [[UILabel alloc] initWithFrame:CGRectMake(width, 0, width, height)]; _centerLabel.textAlignment = NSTextAlignmentCenter; [self addSubview:_centerLabel]; // 右侧按钮 _rightButton = [[UIButton alloc] initWithFrame:CGRectMake(width * 2, 0, width, height)]; [_rightButton addTarget:self action:@selector(buttonsEvent:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_rightButton]; } return self; } - (void)buttonsEvent:(UIButton *)button { if (button == _leftButton) { if (_rightNormalImage) { [_rightButton setImage:_rightNormalImage forState:UIControlStateNormal]; } if (_rightHighlightedImage) { [_rightButton setImage:_rightHighlightedImage forState:UIControlStateHighlighted]; } // 临时获取值 NSNumber *tmp = @([_currentValue intValue] - [_stepValue intValue]); // 减去的值小于或者等于最小值时 if ([tmp intValue] < [_minValue intValue]) { } else { _currentValue = @([_currentValue intValue] - [_stepValue intValue]); _centerLabel.text = [NSString stringWithFormat:@"%d", [_currentValue intValue]]; if ([_currentValue intValue] == [_minValue intValue]) { if (_leftDisableImage) { [_leftButton setImage:_leftDisableImage forState:UIControlStateNormal]; [_leftButton setImage:_leftDisableImage forState:UIControlStateHighlighted]; } } } } else { if (_leftNormalImage) { [_leftButton setImage:_leftNormalImage forState:UIControlStateNormal]; } if (_leftHighlightedImage) { [_leftButton setImage:_leftHighlightedImage forState:UIControlStateHighlighted]; } // 临时获取值 NSNumber *tmp = @([_currentValue intValue] + [_stepValue intValue]); // 减去的值小于或者等于最小值时 if ([tmp intValue] > [_maxValue intValue]) { } else { _currentValue = @([_currentValue intValue] + [_stepValue intValue]); _centerLabel.text = [NSString stringWithFormat:@"%d", [_currentValue intValue]]; if ([_currentValue intValue] == [_maxValue intValue]) { if (_rightDisableImage) { [_rightButton setImage:_rightDisableImage forState:UIControlStateNormal]; [_rightButton setImage:_rightDisableImage forState:UIControlStateHighlighted]; } } } } } - (void)configCenterLabel:(RangeButtonCenterLabel)block { block(self.centerLabel); } #pragma mark - 重写各种setter,getter方法 @synthesize startValue = _startValue; - (void)setStartValue:(NSNumber *)startValue { _startValue = startValue; _currentValue = _startValue; _centerLabel.text = [NSString stringWithFormat:@"%d", [startValue intValue]]; } - (NSNumber *)startValue { return _startValue; } @synthesize rightNormalImage = _rightNormalImage; - (void)setRightNormalImage:(UIImage *)rightNormalImage { _rightNormalImage = rightNormalImage; [_rightButton setImage:_rightNormalImage forState:UIControlStateNormal]; } - (UIImage *)rightNormalImage { return _rightNormalImage; } @synthesize rightHighlightedImage = _rightHighlightedImage; - (void)setRightHighlightedImage:(UIImage *)rightHighlightedImage { _rightHighlightedImage = rightHighlightedImage; [_rightButton setImage:rightHighlightedImage forState:UIControlStateHighlighted]; } - (UIImage *)rightHighlightedImage { return _rightHighlightedImage; } @synthesize leftNormalImage = _leftNormalImage; - (void)setLeftNormalImage:(UIImage *)leftNormalImage { _leftNormalImage = leftNormalImage; [_leftButton setImage:leftNormalImage forState:UIControlStateNormal]; } - (UIImage *)leftNormalImage { return _leftNormalImage; } @synthesize leftHighlightedImage = _leftHighlightedImage; - (void)setLeftHighlightedImage:(UIImage *)leftHighlightedImage { _leftHighlightedImage = leftHighlightedImage; [_leftButton setImage:leftHighlightedImage forState:UIControlStateHighlighted]; } - (UIImage *)leftHighlightedImage { return _leftHighlightedImage; } @synthesize buttonWidth = _buttonWidth; - (void)setButtonWidth:(CGFloat)buttonWidth { _buttonWidth = buttonWidth; if (_buttonWidth > 0 && _buttonWidth < self.frame.size.width / 2.f) { _leftButton.frame = CGRectMake(0, 0, _buttonWidth, self.frame.size.height); _centerLabel.frame = CGRectMake(_buttonWidth, 0, self.frame.size.width - _buttonWidth*2, self.frame.size.height); _rightButton.frame = CGRectMake(self.frame.size.width - _buttonWidth, 0, _buttonWidth, self.frame.size.height); } } - (CGFloat)buttonWidth { return _buttonWidth; } @end
实现的源码:
// // ViewController.m // PulsingView // // Created by YouXianMing on 14/10/29. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h" #import "RangeButton.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; RangeButton *rangeButton = [[RangeButton alloc] initWithFrame:CGRectMake(100, 100, 100, 22)]; rangeButton.maxValue = @10; rangeButton.minValue = @0; rangeButton.startValue = @5; rangeButton.stepValue = @1; rangeButton.rightNormalImage = [UIImage imageNamed:@"后_nor"]; rangeButton.rightHighlightedImage = [UIImage imageNamed:@"后_high"]; rangeButton.rightDisableImage = [UIImage imageNamed:@"后_dis"]; rangeButton.leftNormalImage = [UIImage imageNamed:@"前_nor"]; rangeButton.leftHighlightedImage = [UIImage imageNamed:@"前_high"]; rangeButton.leftDisableImage = [UIImage imageNamed:@"前_dis"]; rangeButton.buttonWidth = 29; [rangeButton configCenterLabel:^(UILabel *label) { label.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:18.f]; label.textColor = [UIColor yellowColor]; }]; [self.view addSubview:rangeButton]; } @end
重点需要注意的地方: