定制选择范围的按钮RangeButton

效果:

源码:

RangeButton.h 与 RangeButton.m

  1. //
  2. // RangeButton.h
  3. // PulsingView
  4. //
  5. // Created by YouXianMing on 14/10/29.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10. #import <UIKit/UIKit.h>
  11.  
  12. typedef void (^RangeButtonCenterLabel)(UILabel *label);
  13.  
  14. @interface RangeButton : UIView
  15.  
  16. /**
  17. * 最开始显示的值
  18. */
  19. @property (nonatomic, strong) NSNumber *startValue;
  20.  
  21. /**
  22. * 每一次增加或者减少的值
  23. */
  24. @property (nonatomic, strong) NSNumber *stepValue;
  25.  
  26. /**
  27. * 最大值
  28. */
  29. @property (nonatomic, strong) NSNumber *maxValue;
  30.  
  31. /**
  32. * 最小值
  33. */
  34. @property (nonatomic, strong) NSNumber *minValue;
  35.  
  36. /**
  37. * 左侧按钮的普通图片,高亮图片,不能点击时的图片
  38. */
  39. @property (nonatomic, strong) UIImage *leftNormalImage;
  40. @property (nonatomic, strong) UIImage *leftHighlightedImage;
  41. @property (nonatomic, strong) UIImage *leftDisableImage;
  42.  
  43. /**
  44. * 右侧按钮的普通图片,高亮图片,不能点击时的图片
  45. */
  46. @property (nonatomic, strong) UIImage *rightNormalImage;
  47. @property (nonatomic, strong) UIImage *rightHighlightedImage;
  48. @property (nonatomic, strong) UIImage *rightDisableImage;
  49.  
  50. /**
  51. * 当前值
  52. */
  53. @property (nonatomic, strong, readonly) NSNumber *currentValue;
  54.  
  55. /**
  56. * 定制label
  57. *
  58. * @param block 中间的label
  59. */
  60. - (void)configCenterLabel:(RangeButtonCenterLabel)block;
  61.  
  62. /**
  63. * 设置按钮的宽度(重置3个控件的frame值)
  64. */
  65. @property (nonatomic, assign) CGFloat buttonWidth;
  66.  
  67. @end
  1. //
  2. // RangeButton.m
  3. // PulsingView
  4. //
  5. // Created by YouXianMing on 14/10/29.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "RangeButton.h"
  10.  
  11. @interface RangeButton ()
  12. @property (nonatomic, strong) UIButton *leftButton;
  13. @property (nonatomic, strong) UIButton *rightButton;
  14. @property (nonatomic, strong) UILabel *centerLabel;
  15. @property (nonatomic, strong) NSNumber *currentValue;
  16. @end
  17.  
  18. @implementation RangeButton
  19.  
  20. - (instancetype)initWithFrame:(CGRect)frame
  21. {
  22. self = [super initWithFrame:frame];
  23. if (self) {
  24. CGFloat width = frame.size.width / .f;
  25. CGFloat height = frame.size.height;
  26.  
  27. // 左侧按钮
  28. _leftButton = [[UIButton alloc] initWithFrame:CGRectMake(, , width, height)];
  29. [_leftButton addTarget:self
  30. action:@selector(buttonsEvent:)
  31. forControlEvents:UIControlEventTouchUpInside];
  32. [self addSubview:_leftButton];
  33.  
  34. // 中间Label
  35. _centerLabel = [[UILabel alloc] initWithFrame:CGRectMake(width, , width, height)];
  36. _centerLabel.textAlignment = NSTextAlignmentCenter;
  37. [self addSubview:_centerLabel];
  38.  
  39. // 右侧按钮
  40. _rightButton = [[UIButton alloc] initWithFrame:CGRectMake(width * , , width, height)];
  41. [_rightButton addTarget:self
  42. action:@selector(buttonsEvent:)
  43. forControlEvents:UIControlEventTouchUpInside];
  44. [self addSubview:_rightButton];
  45. }
  46. return self;
  47. }
  48.  
  49. - (void)buttonsEvent:(UIButton *)button {
  50. if (button == _leftButton) {
  51. if (_rightNormalImage) {
  52. [_rightButton setImage:_rightNormalImage forState:UIControlStateNormal];
  53. }
  54. if (_rightHighlightedImage) {
  55. [_rightButton setImage:_rightHighlightedImage forState:UIControlStateHighlighted];
  56. }
  57.  
  58. // 临时获取值
  59. NSNumber *tmp = @([_currentValue intValue] - [_stepValue intValue]);
  60.  
  61. // 减去的值小于或者等于最小值时
  62. if ([tmp intValue] < [_minValue intValue]) {
  63. } else {
  64. _currentValue = @([_currentValue intValue] - [_stepValue intValue]);
  65. _centerLabel.text = [NSString stringWithFormat:@"%d", [_currentValue intValue]];
  66.  
  67. if ([_currentValue intValue] == [_minValue intValue]) {
  68. if (_leftDisableImage) {
  69. [_leftButton setImage:_leftDisableImage forState:UIControlStateNormal];
  70. [_leftButton setImage:_leftDisableImage forState:UIControlStateHighlighted];
  71. }
  72. }
  73. }
  74. } else {
  75. if (_leftNormalImage) {
  76. [_leftButton setImage:_leftNormalImage forState:UIControlStateNormal];
  77. }
  78. if (_leftHighlightedImage) {
  79. [_leftButton setImage:_leftHighlightedImage forState:UIControlStateHighlighted];
  80. }
  81.  
  82. // 临时获取值
  83. NSNumber *tmp = @([_currentValue intValue] + [_stepValue intValue]);
  84.  
  85. // 减去的值小于或者等于最小值时
  86. if ([tmp intValue] > [_maxValue intValue]) {
  87. } else {
  88. _currentValue = @([_currentValue intValue] + [_stepValue intValue]);
  89. _centerLabel.text = [NSString stringWithFormat:@"%d", [_currentValue intValue]];
  90.  
  91. if ([_currentValue intValue] == [_maxValue intValue]) {
  92. if (_rightDisableImage) {
  93. [_rightButton setImage:_rightDisableImage forState:UIControlStateNormal];
  94. [_rightButton setImage:_rightDisableImage forState:UIControlStateHighlighted];
  95. }
  96. }
  97. }
  98. }
  99. }
  100.  
  101. - (void)configCenterLabel:(RangeButtonCenterLabel)block {
  102. block(self.centerLabel);
  103. }
  104.  
  105. #pragma mark - 重写各种setter,getter方法
  106. @synthesize startValue = _startValue;
  107. - (void)setStartValue:(NSNumber *)startValue {
  108. _startValue = startValue;
  109. _currentValue = _startValue;
  110. _centerLabel.text = [NSString stringWithFormat:@"%d", [startValue intValue]];
  111. }
  112. - (NSNumber *)startValue {
  113. return _startValue;
  114. }
  115.  
  116. @synthesize rightNormalImage = _rightNormalImage;
  117. - (void)setRightNormalImage:(UIImage *)rightNormalImage {
  118. _rightNormalImage = rightNormalImage;
  119. [_rightButton setImage:_rightNormalImage forState:UIControlStateNormal];
  120. }
  121. - (UIImage *)rightNormalImage {
  122. return _rightNormalImage;
  123. }
  124.  
  125. @synthesize rightHighlightedImage = _rightHighlightedImage;
  126. - (void)setRightHighlightedImage:(UIImage *)rightHighlightedImage {
  127. _rightHighlightedImage = rightHighlightedImage;
  128. [_rightButton setImage:rightHighlightedImage forState:UIControlStateHighlighted];
  129. }
  130. - (UIImage *)rightHighlightedImage {
  131. return _rightHighlightedImage;
  132. }
  133.  
  134. @synthesize leftNormalImage = _leftNormalImage;
  135. - (void)setLeftNormalImage:(UIImage *)leftNormalImage {
  136. _leftNormalImage = leftNormalImage;
  137. [_leftButton setImage:leftNormalImage forState:UIControlStateNormal];
  138. }
  139. - (UIImage *)leftNormalImage {
  140. return _leftNormalImage;
  141. }
  142.  
  143. @synthesize leftHighlightedImage = _leftHighlightedImage;
  144. - (void)setLeftHighlightedImage:(UIImage *)leftHighlightedImage {
  145. _leftHighlightedImage = leftHighlightedImage;
  146. [_leftButton setImage:leftHighlightedImage forState:UIControlStateHighlighted];
  147. }
  148. - (UIImage *)leftHighlightedImage {
  149. return _leftHighlightedImage;
  150. }
  151.  
  152. @synthesize buttonWidth = _buttonWidth;
  153. - (void)setButtonWidth:(CGFloat)buttonWidth {
  154. _buttonWidth = buttonWidth;
  155.  
  156. if (_buttonWidth > && _buttonWidth < self.frame.size.width / .f) {
  157. _leftButton.frame = CGRectMake(, , _buttonWidth, self.frame.size.height);
  158. _centerLabel.frame = CGRectMake(_buttonWidth, , self.frame.size.width - _buttonWidth*, self.frame.size.height);
  159. _rightButton.frame = CGRectMake(self.frame.size.width - _buttonWidth, , _buttonWidth, self.frame.size.height);
  160. }
  161.  
  162. }
  163. - (CGFloat)buttonWidth {
  164. return _buttonWidth;
  165. }
  166.  
  167. @end

实现的源码:

  1. //
  2. // ViewController.m
  3. // PulsingView
  4. //
  5. // Created by YouXianMing on 14/10/29.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10. #import "RangeButton.h"
  11.  
  12. @interface ViewController ()
  13. @end
  14.  
  15. @implementation ViewController
  16.  
  17. - (void)viewDidLoad {
  18. [super viewDidLoad];
  19. self.view.backgroundColor = [UIColor blackColor];
  20.  
  21. RangeButton *rangeButton = [[RangeButton alloc] initWithFrame:CGRectMake(, , , )];
  22.  
  23. rangeButton.maxValue = @;
  24. rangeButton.minValue = @;
  25. rangeButton.startValue = @;
  26. rangeButton.stepValue = @;
  27.  
  28. rangeButton.rightNormalImage = [UIImage imageNamed:@"后_nor"];
  29. rangeButton.rightHighlightedImage = [UIImage imageNamed:@"后_high"];
  30. rangeButton.rightDisableImage = [UIImage imageNamed:@"后_dis"];
  31. rangeButton.leftNormalImage = [UIImage imageNamed:@"前_nor"];
  32. rangeButton.leftHighlightedImage = [UIImage imageNamed:@"前_high"];
  33. rangeButton.leftDisableImage = [UIImage imageNamed:@"前_dis"];
  34.  
  35. rangeButton.buttonWidth = ;
  36.  
  37. [rangeButton configCenterLabel:^(UILabel *label) {
  38. label.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:.f];
  39. label.textColor = [UIColor yellowColor];
  40. }];
  41.  
  42. [self.view addSubview:rangeButton];
  43. }
  44.  
  45. @end

重点需要注意的地方:

定制选择范围的按钮RangeButton的更多相关文章

  1. MFC选择文件(夹)按钮实现

    MFC选择文件(夹)按钮实现 选择文件(夹) void CFileSelectDlg::OnBnClickedButtonSelect() { if(((CButton*)(GetDlgItem(ID ...

  2. 定制二选一按钮SwitchButton

    定制二选一按钮SwitchButton 效果: 源码: SwitchButton.h 与 SwitchButton.m // // SwitchButton.h // KongJian // // C ...

  3. Java+Selenium 上传文件,点击选择“浏览文件”按钮,报错invalid argument

    Java+Selenium 上传文件,点击选择"浏览文件"按钮,报错invalid argument 解决代码: Actions action=new Actions(driver ...

  4. Dynamics CRM定制子网格添加按钮实例之二:调试代码、打开Web资源及获取选择的记录

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复222或者20160501可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. Dynamics CRM定制子网格添加按钮实例之一

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复221或者20160430可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  6. ASPxGridView后台获取edit、delete、选择框等按钮。

    GridViewCommandColumn commandColumn = (GridViewCommandColumn)ASPxGridViewInstance.Columns["#&qu ...

  7. 定制Android透明按钮

    自己在学习和做例子的过程中,常常会需要按钮,由于系统自带按钮样式不太好看,所以需要我们自己来定制项目得按钮,我常常采用2中方法: 1.是制作9-patch的图片,这样能够匹配文字内容的长短. 2.是指 ...

  8. WebUploader 上传插件结合bootstrap的模态框使用时选择上传文件按钮无效问题的解决方法

    由于种种原因(工作忙,要锻炼健身,要看书,要学习其他兴趣爱好,谈恋爱等),博客已经好久没有更新,为这个内心一直感觉很愧疚,今天开始决定继续更新博客,每周至少一篇,最多不限篇幅. 今天说一下,下午在工作 ...

  9. Flex4之皮肤定制

    Flex4之皮肤定制[Skin类和Skin类]          博客分类: RIA-Flex4专栏 FlexAdobeUPFlashUI 第一.关于spark.skin.SparkSkin类的 1. ...

随机推荐

  1. python hbase util

    from traceback import format_exc import phoenixdb as pb class Utils(object): def get_db_conn(self, u ...

  2. C# using用法

    一.using指令 使用using指令在文件顶部引入命名空间,如 using System; using System.IO; 二.using别名 用using为命名空间或类型定义别名,当引入的多个命 ...

  3. angular 下载文件

    后台直接返回文件即可,以wcf为例:读取目录文件返回,或直接生成文件并返回. public Stream GetCodeSn() { return File.OpenRead("e:\\工作 ...

  4. 怎样写SQL语句可以提高数据库的性能

    1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个10万条记录的表中查1条记录 ...

  5. sgsdg

    wrjow we wetwer werwer werwer werqw qweqwrq qwrqwr @ApiOperation("根据条件分页查询试卷") @ApiRespons ...

  6. org.springframework.web.context.ContextLoaderListener 解决办法

    最近部署ssm项目在tomcat,tomcat启动的时候发出org.springframework.web.context.ContextLoaderListener 错误 严重: Error con ...

  7. 我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)

    [名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化(  ...

  8. IDEA 导出maven项目所有的依赖包到指定的目录

    问题产生: 需要把一个maven工程调整结构,部署到一个新环境中,需要把依赖的jar包,单独打到一个目录中. 解决方案: 需要两步便可以copy到指定的目录中. 第一步: 找到maven projec ...

  9. fzu 2163

    Problem 2163 多米诺骨牌 Accept: 17    Submit: 50Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem ...

  10. Mybatis之reflection包源代码解析(一)

      一.序言 Mybatis作为ORM,实现了对象与关系数据库间的映射.Mybatis中的映射包含两个方面: 1.将对象中的值(parameterType所指定的对象)映射到具体的sql中,例如: & ...