定制选择范围的按钮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
重点需要注意的地方: