当前位置: 首页 > news >正文

ios中UIButton选中状态切换

关于UIButton的事件枚举有许多,平时用的少所以很多的都不是很清楚,今天了解了下,看了以前的代码,觉得在UIButton选中时操作写了许多冗余代码,而忽略了UIButton一个很重要的属性,如下:

[objc] view plain copy print?
  1. typedef NS_OPTIONS(NSUInteger, UIControlState) {  
  2.     UIControlStateNormal       = 0,  
  3.     UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set  
  4.     UIControlStateDisabled     = 1 << 1,  
  5.     UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)  
  6. #ifndef SDK_HIDE_TIDE  
  7.     UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 3, // Applicable only when the screen supports focus  
  8. #endif  
  9.     UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use  
  10.     UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use  
  11. };  

中的UIControlStateSelected表示是否选中,NO表示未选中,YES表示选中;

1.这是之前写的:

创建UIButton,通过for 循环去创建

[objc] view plain copy print?
  1. //顶部view的初始化  
  2. - (void)initTopView{  
  3.       
  4.     topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, 40)];  
  5.     topFrame = topView.frame;  
  6.     topView.backgroundColor = [UIColor whiteColor];  
  7.     topView.alpha = .8;  
  8.       
  9.     NSArray *titleArr = @[@"人气",@"价格",@"桌数",@"优惠"];  
  10.     for (int i = 0; i < titleArr.count; i ++) {  
  11.         UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];  
  12.         [btn setTitle:titleArr[i] forState:UIControlStateNormal];  
  13.         [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];  
  14.         [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];  
  15.         [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];  
  16.         btn.titleLabel.font = [UIFont systemFontOfSize:12];  
  17.         btn.showsTouchWhenHighlighted = YES;  
  18.         btn.frame = CGRectMake(10 + i * ((kScreen_width - 50)/4 + 10) , 10, (kScreen_width - 50)/4, 25);  
  19.         //设置tag值  
  20.         btn.tag = i + 100;  
  21.         [btn addTarget:self action:@selector(choose:) forControlEvents:UIControlEventTouchUpInside];  
  22.         [topView addSubview:btn];  
  23.     }  
  24.       
  25.     [self.view addSubview:topView];  
  26. }  


添加响应事件:

[objc] view plain copy print?
  1. //人气、价格、作品数、优惠  
  2. - (void)choose:(UIButton *)sender{  
  3.     for (int i = 0; i < 4; i++) {  
  4.         UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];  
  5.         [btn setSelected:NO];  
  6.         if (!btn.selected) {  
  7.             [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];  
  8.             [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];  
  9.             [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];  
  10.         }  
  11.     }  
  12.     UIButton *button = (UIButton *)sender;  
  13.     [button setSelected:YES];  
  14.     [button setImage:[UIImage imageNamed:@"pho"] forState:UIControlStateNormal];  
  15.     [button setTitleColor:[UIColor colorWithRed:170.0/255 green:107.0/255 blue:208.0/255 alpha:1] forState:UIControlStateNormal];  
  16.     [button setBackgroundImage:[UIImage imageNamed:@"button2"] forState:UIControlStateNormal];  
  17. }  


这种是最简单的,相对也是最繁琐的,多了很多不必要的冗余代码,下面就让我们看看改进的;

2.通过使用UIButton自己的一个selected属性和normal属性重构的,如下所示

[objc] view plain copy print?
  1. -(void)initUIButtonView{  
  2.       
  3.     _titleArr = @[@"人气",@"价格",@"桌数",@"优惠"];  
  4.       
  5.     for (int i = 0; i < _titleArr.count; i ++) {  
  6.         UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];  
  7.         btn.frame = CGRectMake(10 + i * ((kScreen_width - 50)/4 + 10) , 20, (kScreen_width - 50)/4, 25);  
  8.         [btn setTitle:_titleArr[i] forState:UIControlStateNormal];  
  9.         btn.titleLabel.font = [UIFont systemFontOfSize:12];  
  10.         btn.showsTouchWhenHighlighted = YES;  
  11.         //设置tag值  
  12.         btn.tag = i + 100;  
  13.         btn.selected = NO;  
  14.         [btn addTarget:self action:@selector(choose:) forControlEvents:UIControlEventTouchUpInside];  
  15.         [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];  
  16.         [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];  
  17.         [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];  
  18.   
  19.         [btn setTitleColor:[UIColor colorWithRed:170.0/255 green:107.0/255 blue:208.0/255 alpha:1] forState:UIControlStateSelected];  
  20.         [btn setImage:[UIImage imageNamed:@"pho"] forState:UIControlStateSelected];  
  21.         [btn setBackgroundImage:[UIImage imageNamed:@"button2"] forState:UIControlStateSelected];  
  22.         [self.view addSubview:btn];  
  23.     }  
  24.   
  25. }  

在创建的时候就给定了正常时候UIButton的样式,和选中UIButton时的按钮颜色,注意这里设置了默认的selected = NO;和UIControlStateSelected

在给定按钮选择事件,设置对应selected的状态值,如下所示:

[objc] view plain copy print?
  1. //人气、价格、作品数、优惠  
  2. - (void)choose:(UIButton *)sender{  
  3.     for (int i = 0; i < _titleArr.count; i++) {  
  4.         UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];  
  5.         [btn setSelected:NO];  
  6.     }  
  7.     UIButton *button = (UIButton *)sender;  
  8.     [button setSelected:YES];  
  9. }  


这样看上去,第二种方法,是不是比第一种方法更简单明了,去除了相关的冗余代码的,效果如下所示


注:改进,上面的我们可以在不同的按钮上面切换状态,但在同一个按钮上面点击多次状态不会改变,针对上述问题做了些许的改动,其实主要是在点击事件里面,判断当前按钮的状态去改变,代码如下:

[objc] view plain copy print?
  1. //人气、价格、作品数、优惠  
  2. - (void)choose:(UIButton *)sender{  
  3.     for (int i = 0; i < _titleArr.count; i++) {  
  4.         UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];  
  5.         //选中当前按钮时  
  6.         if (sender.tag == btn.tag) {  
  7.               
  8.             sender.selected = !sender.selected;  
  9.         }else{  
  10.               
  11.             [btn setSelected:NO];  
  12.         }  
  13.     }  
  14.   
  15. }  


效果图如下所示:

相关文章:

  • WebRTC 的工作原理解析 | 掘金技术征文
  • Spring Boot中使用Swagger2构建强大的RESTful API文档
  • spring2.5整合struts2
  • 重学前端(六)-JavaScript中的class
  • Spring Security 基础登录实例
  • PostgreSQL pgbench SQL RT 与 事务RT 浅析
  • 决策树 熵
  • Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件
  • 洛谷P2676 超级书架
  • 讲清楚分布式系统中的这个算法,帮你从面试候选人中脱颖而出!
  • 我的第一天!
  • JAVA-基础(接口---抽象)
  • 从0开始学习 GITHUB 系列之「GITHUB 常见的几种操作」
  • 【JavaEE企业应用实战学习记录】struts2实现登录并获取各个范围的数据
  • [译] 2019 年了,为什么我还在用 jQuery?
  • create-react-app做的留言板
  • CSS 专业技巧
  • CSS实用技巧干货
  • HTTP那些事
  • rabbitmq延迟消息示例
  • SQLServer之创建数据库快照
  • STAR法则
  • Terraform入门 - 3. 变更基础设施
  • 大整数乘法-表格法
  • 回顾2016
  • 聊一聊前端的监控
  • 免费小说阅读小程序
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端存储 - localStorage
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 通过几道题目学习二叉搜索树
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 【云吞铺子】性能抖动剖析(二)
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ![CDATA[ ]] 是什么东东
  • # C++之functional库用法整理
  • (javascript)再说document.body.scrollTop的使用问题
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (三)uboot源码分析
  • (小白学Java)Java简介和基本配置
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)http协议
  • .cfg\.dat\.mak(持续补充)
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 常见的偏门问题
  • .net 生成二级域名
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET导入Excel数据
  • :O)修改linux硬件时间
  • @拔赤:Web前端开发十日谈