自定义UISlider之点触摸

ViewController.m

 1 #import "ViewController.h"

 2 #import "MySlider.h"  // 导入自定义封装的MySlider类头文件

 3 @interface ViewController ()

 4 @end

 5 @implementation ViewController

 6             

 7 - (void)viewDidLoad {

 8     [super viewDidLoad];

 9     

10      // 使用自定义封装的MySlider类新建一个slider,并初始化位置及大小

11     MySlider* slider = [[MySlider alloc]initWithFrame:CGRectMake(10, 100, 300, 100)];

12     

13     // 设置背景颜色

14     // slider.backgroundColor = [UIColor brownColor];

15     // 监听响应事件

16     [slider addTarget:self action:@selector(changeValue:) forControlEvents:UIControlEventValueChanged];

17     // 设置最大值

18     slider.minValue = 10;

19     // 设置最小值

20     slider.maxValue = 300;

21     // 设置当前值

22     slider.curValue = 160;

23     // 设置滑条颜色

24     [slider setProgressColor:[UIColor purpleColor]];

25     // 添加到视图上

26     [self.view addSubview:slider];

27     

28 }

29 // 监听的响应事件

30 - (void)changeValue:(MySlider*)sender{

31     // 打印输入当前值

32     NSLog(@"%g",sender.curValue);

33 }

MySlider.h

 1 #import <UIKit/UIKit.h>

 2 

 3 @interface MySlider : UIControl

 4 /** 最小、大值 */

 5 @property (nonatomic,assign) int minValue,maxValue;

 6 /** 当前值 */

 7 @property (nonatomic,assign) float curValue;

 8 /** 重设进度条颜色 */

 9 - (void)setProgressColor:(UIColor*)color;

10 /** 重设滑块颜色 */

11 - (void)setThumbColor:(UIColor*)color;

12 @end

MySlider.m

  1 #import "MySlider.h"

  2 

  3 @implementation MySlider

  4 // 自定义初始化方法

  5 - (instancetype)init{

  6     if (self != [super init]) {

  7         // 调用自定义的initSubView方法

  8         [self initSubView];

  9     }

 10     return self;

 11 }

 12 // 自定义带位置及大小的初始化方法

 13 - (instancetype)initWithFrame:(CGRect)frame

 14 {

 15     self = [super initWithFrame:frame];

 16     if (self) {

 17         // 调用自定义的initSubView方法

 18         [self initSubView];

 19     }

 20     return self;

 21 }

 22 #pragma mark - 封装自定义的UISlider属性

 23 // 封装自定义的UISlider属性

 24 - (void)initSubView{

 25     // 使用UIView新建一个progress进度条,并设置位置及大小

 26     UIView* progress = [[UIView alloc]initWithFrame:CGRectMake(0,0,self.frame.size.width, 10)];

 27     // 定义一个CGPoint类型的变量center

 28     CGPoint center;

 29     // 获取进度条父视图x轴的中心点坐标

 30     center.x = CGRectGetMidX(self.bounds);

 31     // 获取进度条父视图y轴的中心点坐标

 32     center.y = CGRectGetMidY(self.bounds);

 33     

 34 //    center.x = self.frame.size.width/2;

 35 //    center.y = self.frame.size.height/2-5;

 36     // 把获取的中心点坐标赋值给进度条

 37     progress.center = center;

 38     // 设置进度条背景颜色

 39     progress.backgroundColor = [UIColor grayColor];

 40     // 设置进度条标签

 41     progress.tag = 1;

 42     // 把进度条添加到视图上

 43     [self addSubview:progress];

 44     

 45     // 使用UIView新建一个thumb滑块,并设置位置及大小

 46     UIView* thumb = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];

 47     // 设置滑块标签

 48     thumb.tag = 2;

 49     // 设置滑块背景颜色

 50     thumb.backgroundColor = [UIColor redColor];

 51     // 设置滑块圆角

 52     thumb.layer.cornerRadius = 15;

 53     // 把获取的中心点赋值给滑块

 54     thumb.center = center;

 55     // 把滑块添加到视图上

 56     [self addSubview:thumb];

 57 }

 58 #pragma mark - 设置滑块当前值

 59 // 设置滑块当前值

 60 - (void)setCurValue:(float)curValue

 61 {

 62     // 把设置的当前值赋值给变量_curValue

 63     _curValue = curValue;

 64     // 定义一个CGPoint类型的变量center接收通过标签来获取的滑块的中心点

 65     CGPoint center = [self viewWithTag:2].center;

 66     // 设置的当前值如果小于最小值或大于最大值就返回,当前值为默认值(此时默认值为上面获取的中心点);

 67     if (_curValue<_minValue || _curValue>_maxValue) {

 68         return;

 69         // 否则,就把当前值减去最小值,除以,最大值减去最小值,的百分比

 70         // 乘以进度条的宽度的值赋值给滑块中心点的x的值

 71     }else{

 72         center.x = (_curValue - _minValue)/(_maxValue - _minValue)*[self viewWithTag:1].frame.size.width;

 73     }

 74     // 打印输出此时滑块相对于整个屏幕x轴中心点的x值和滑块此时相对于滑条的当前值;

 75     NSLog(@"center.x = %f,_curValue = %g",center.x,_curValue);

 76     // 把中心点重新赋值赋值给滑块

 77     [self viewWithTag:2].center = center;

 78 }

 79 #pragma mark - 设置进度条颜色

 80 // 设置进度条颜色

 81 - (void)setProgressColor:(UIColor *)color{

 82     // 定义一个UIView类型的变量view来接收通过标签获取的进度条

 83     UIView *view = [self viewWithTag:1];

 84     // 把设置的颜色赋值给进度条

 85     view.backgroundColor = color;

 86 }

 87 #pragma mark - 设置滑块颜色

 88 // 设置滑块颜色

 89 - (void)setThumbColor:(UIColor *)color{

 90      // 定义一个UIView类型的变量view来接收通过标签获取的滑块

 91     UIView* view = [self viewWithTag:2];

 92     // 把设置的颜色赋值给滑块

 93     view.backgroundColor = color;

 94 }

 95 #pragma mark - 封装touch方法

 96 // 封装touch方法

 97 -(void)touchesEnded:(NSSet *)touches{

 98     // 定义一个UITouch类型的变量touch,并初始化为被点击的任意对象

 99     UITouch* touch = [touches anyObject];

100     // 定义一个CGPoint类型的变量p,并初始化为被点击对象的位置(x、y坐标)

101     CGPoint p = [touch locationInView:self];

102     // 定义一个CGPoint类型的变量center接收通过标签来获取的滑块的中心点

103     CGPoint center = [self viewWithTag:2].center;

104     // 如果点击的位置小于0或者点击的位置大于被点击对象的最大x值就返回

105     // (表示如果点击的位置超出了滑条两端的位置就没有反应)

106     if (p.x < 0||p.x>self.frame.size.width) {

107         return;

108     }

109     // 如果点击位置的y轴坐标的值减去滑块中心点坐标y轴的值的绝对值大于15就返回

110     // (表示如果点击的位置距离进度条的位置,高度超过15就没有反应)

111     if(ABS(p.y - center.y)>15){

112         return;

113     }

114     // 把点击位置的x轴坐标赋值给滑块的中心点x坐标

115     center.x = p.x;

116     // 把改变x轴位置后的中心点重新赋值给滑块

117     [self viewWithTag:2].center = center;

118     // 定义一个float类型的变量rate,初始化为:点击的x轴坐标除以进度条父类视图的宽度的百分比

119     float rate = p.x / self.frame.size.width;

120     // 把最小值加最大值减去最小值的差乘以百分比的值赋值给当前值

121     _curValue = _minValue + (_maxValue - _minValue)*rate;

122     // 当值改变的时候发送消息给滑块本身

123     [self sendActionsForControlEvents:UIControlEventValueChanged];

124 }

125 #pragma mark - 触摸开始

126 // 触摸开始

127 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

128     // 调用封装好的touch方法

129     [self touchesEnded:touches];

130 }

131 #pragma mark - 按钮移动

132 // 按钮移动

133 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

134     // 调用封装好的touch方法

135     [self touchesEnded:touches];

136 }

137 #pragma mark - 结束触摸

138 // 结束触摸

139 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

140     // 调用封装好的touch方法

141     [self touchesEnded:touches];

142 }

143 @end

 

你可能感兴趣的:(slider)