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

  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 循环去创建

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

添加响应事件:

  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属性重构的,如下所示

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

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

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

  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. }

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

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

  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. sender.selected = !sender.selected;
  8. }else{
  9. [btn setSelected:NO];
  10. }
  11. }
  12. }

效果图如下所示:

ios中UIButton选中状态切换的更多相关文章

  1. iOS UIButton选中状态切换

    UIButton*payBtn = [UIButtonbuttonWithType:UIButtonTypeCustom]; payBtn.frame=CGRectMake(size.width-24 ...

  2. iOS中UIButton控件的用法及部分参数解释

    在UI控件中UIButton是极其常用的一类控件,它的类对象创建与大多数UI控件使用实例方法init创建不同,通常使用类方法创建: + (id)buttonWithType:(UIButtonType ...

  3. iOS 中各种横竖屏切换总结

    iOS 中横竖屏切换的功能,在开发iOS app中总能遇到.以前看过几次,感觉简单,但是没有敲过代码实现,最近又碰到了,demo尝试了几种情况,这里就做下总结.注意 横屏两种情况是反的你知道吗? UI ...

  4. iOS 中UIButton的 settitle 和 titlelabel的使用误区

    UIButton中设置Titl方法包括以下几种: - (void)setTitle:(NSString *)title forState:(UIControlState)state; - (void) ...

  5. IOS中UIButton和UIImageView的区别

    1.使用场合 UIImageView:如果仅仅是为了显示图片,不需要监听图片的点击事件 UIButton:既要显示图片,又要监听图片等点击事件 2.相同点 都能显示图片 3.不同点 UIButton能 ...

  6. Js获取Gridview中Dropdownlist选中状态

    在Gridview中加入Dropdownlist模板列,加入DropDownlist 是一种常用的操作,其中涉及到如何获取选择项和Gridview重新绑定两个要点. 如图 前台代码如下 <%@ ...

  7. html li css选中状态切换

    思路:点击当前li元素后是用removeClass()删除所有兄弟元素(使用siblings()获取)的class样式,然后使用addClass()为当前li添加class. 具体演示如下: 1.HT ...

  8. iOS开发 tabBarController选中状态

    self.tabBarController.selectedIndex = 0;  // 默认是0:

  9. ios 清除列表选中状态

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

随机推荐

  1. ehcache 分布式集群同步数据实例

    本文使用rmi方式,借鉴百度能搜到的文章,但是均不能做到数据同步,做了些改动完全没问题,更详细说明介绍百度即可.直奔主题,可运行的demo实例! 创建一个maven项目,配置pom pom.xml & ...

  2. 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用

    转自:http://kakajw.iteye.com/blog/935226 一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是 ...

  3. 如何使用ping和tracert命令测试网站访问速度

    在我们平时访问的网站中,有一些网站访问速度非常快,比如百度搜索网站和一些门户网站,有些网站访问很慢,有些网站甚至无法访问.那么我们该如何判断这些网站的访问速度呢?下面我们就使用Windows的ping ...

  4. Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字

    报错:Oracle ORA-01722: 无效数字 看了一篇博客,据说是参数与列名不能一致,改过之后还是报一样的错误:Oracle ORA-01722: 无效数字 ,后来试了一下,不是参数名必须不一样 ...

  5. Cgroups概述

    1. Cgroups是什么? 从 2.6.24 版本开始,linux 内核提供了一个叫做 Cgroups的特性.Cgroups是control groups的缩写,是一种可以限制.记录.隔离进程组(p ...

  6. GP(Geoprocessing)服务的发布与调用

    转自:http://www.cnblogs.com/gisangela/archive/2011/01/06/1927702.html 1.什么是GP服务 GP服务是Geoprocessing服务的简 ...

  7. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  8. 设计模式_Decorator_装饰模式

    形象例子: Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖 ...

  9. 未能加载文件或程序集“WcfService”或它的某一个依赖项。试图加载格式不正确的程序。

    “/”应用程序中的服务器错误. 未能加载文件或程序集“WcfService”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息, ...

  10. Objective-C之消息机制

    话说2014年4月编程语言排行榜中Objective-C的使用比又增加了,看来IOS和MAX OS的开发者是真给力呀. 不过个人感觉用不了多久,IOS和Android的开发者收入就不会有那么大的差异了 ...