ios中UIButton选中状态切换
关于UIButton的事件枚举有许多,平时用的少所以很多的都不是很清楚,今天了解了下,看了以前的代码,觉得在UIButton选中时操作写了许多冗余代码,而忽略了UIButton一个很重要的属性,如下:
- typedef NS_OPTIONS(NSUInteger, UIControlState) {
- UIControlStateNormal = 0,
- UIControlStateHighlighted = 1 << 0, // used when UIControl isHighlighted is set
- UIControlStateDisabled = 1 << 1,
- UIControlStateSelected = 1 << 2, // flag usable by app (see below)
- #ifndef SDK_HIDE_TIDE
- UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 3, // Applicable only when the screen supports focus
- #endif
- UIControlStateApplication = 0x00FF0000, // additional flags available for application use
- UIControlStateReserved = 0xFF000000 // flags reserved for internal framework use
- };
中的UIControlStateSelected表示是否选中,NO表示未选中,YES表示选中;
1.这是之前写的:
创建UIButton,通过for 循环去创建
- //顶部view的初始化
- - (void)initTopView{
- topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, 40)];
- topFrame = topView.frame;
- topView.backgroundColor = [UIColor whiteColor];
- topView.alpha = .8;
- NSArray *titleArr = @[@"人气",@"价格",@"桌数",@"优惠"];
- for (int i = 0; i < titleArr.count; i ++) {
- UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
- [btn setTitle:titleArr[i] forState:UIControlStateNormal];
- [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];
- [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
- [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];
- btn.titleLabel.font = [UIFont systemFontOfSize:12];
- btn.showsTouchWhenHighlighted = YES;
- btn.frame = CGRectMake(10 + i * ((kScreen_width - 50)/4 + 10) , 10, (kScreen_width - 50)/4, 25);
- //设置tag值
- btn.tag = i + 100;
- [btn addTarget:self action:@selector(choose:) forControlEvents:UIControlEventTouchUpInside];
- [topView addSubview:btn];
- }
- [self.view addSubview:topView];
- }
添加响应事件:
- //人气、价格、作品数、优惠
- - (void)choose:(UIButton *)sender{
- for (int i = 0; i < 4; i++) {
- UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];
- [btn setSelected:NO];
- if (!btn.selected) {
- [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];
- [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
- [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];
- }
- }
- UIButton *button = (UIButton *)sender;
- [button setSelected:YES];
- [button setImage:[UIImage imageNamed:@"pho"] forState:UIControlStateNormal];
- [button setTitleColor:[UIColor colorWithRed:170.0/255 green:107.0/255 blue:208.0/255 alpha:1] forState:UIControlStateNormal];
- [button setBackgroundImage:[UIImage imageNamed:@"button2"] forState:UIControlStateNormal];
- }
这种是最简单的,相对也是最繁琐的,多了很多不必要的冗余代码,下面就让我们看看改进的;
2.通过使用UIButton自己的一个selected属性和normal属性重构的,如下所示:
- -(void)initUIButtonView{
- _titleArr = @[@"人气",@"价格",@"桌数",@"优惠"];
- for (int i = 0; i < _titleArr.count; i ++) {
- UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
- btn.frame = CGRectMake(10 + i * ((kScreen_width - 50)/4 + 10) , 20, (kScreen_width - 50)/4, 25);
- [btn setTitle:_titleArr[i] forState:UIControlStateNormal];
- btn.titleLabel.font = [UIFont systemFontOfSize:12];
- btn.showsTouchWhenHighlighted = YES;
- //设置tag值
- btn.tag = i + 100;
- btn.selected = NO;
- [btn addTarget:self action:@selector(choose:) forControlEvents:UIControlEventTouchUpInside];
- [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
- [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];
- [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];
- [btn setTitleColor:[UIColor colorWithRed:170.0/255 green:107.0/255 blue:208.0/255 alpha:1] forState:UIControlStateSelected];
- [btn setImage:[UIImage imageNamed:@"pho"] forState:UIControlStateSelected];
- [btn setBackgroundImage:[UIImage imageNamed:@"button2"] forState:UIControlStateSelected];
- [self.view addSubview:btn];
- }
- }
在创建的时候就给定了正常时候UIButton的样式,和选中UIButton时的按钮颜色,注意这里设置了默认的selected = NO;和UIControlStateSelected
在给定按钮选择事件,设置对应selected的状态值,如下所示:
- //人气、价格、作品数、优惠
- - (void)choose:(UIButton *)sender{
- for (int i = 0; i < _titleArr.count; i++) {
- UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];
- [btn setSelected:NO];
- }
- UIButton *button = (UIButton *)sender;
- [button setSelected:YES];
- }
这样看上去,第二种方法,是不是比第一种方法更简单明了,去除了相关的冗余代码的,效果如下所示
注:改进,上面的我们可以在不同的按钮上面切换状态,但在同一个按钮上面点击多次状态不会改变,针对上述问题做了些许的改动,其实主要是在点击事件里面,判断当前按钮的状态去改变,代码如下:
- //人气、价格、作品数、优惠
- - (void)choose:(UIButton *)sender{
- for (int i = 0; i < _titleArr.count; i++) {
- UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];
- //选中当前按钮时
- if (sender.tag == btn.tag) {
- sender.selected = !sender.selected;
- }else{
- [btn setSelected:NO];
- }
- }
- }
效果图如下所示:
ios中UIButton选中状态切换的更多相关文章
- iOS UIButton选中状态切换
UIButton*payBtn = [UIButtonbuttonWithType:UIButtonTypeCustom]; payBtn.frame=CGRectMake(size.width-24 ...
- iOS中UIButton控件的用法及部分参数解释
在UI控件中UIButton是极其常用的一类控件,它的类对象创建与大多数UI控件使用实例方法init创建不同,通常使用类方法创建: + (id)buttonWithType:(UIButtonType ...
- iOS 中各种横竖屏切换总结
iOS 中横竖屏切换的功能,在开发iOS app中总能遇到.以前看过几次,感觉简单,但是没有敲过代码实现,最近又碰到了,demo尝试了几种情况,这里就做下总结.注意 横屏两种情况是反的你知道吗? UI ...
- iOS 中UIButton的 settitle 和 titlelabel的使用误区
UIButton中设置Titl方法包括以下几种: - (void)setTitle:(NSString *)title forState:(UIControlState)state; - (void) ...
- IOS中UIButton和UIImageView的区别
1.使用场合 UIImageView:如果仅仅是为了显示图片,不需要监听图片的点击事件 UIButton:既要显示图片,又要监听图片等点击事件 2.相同点 都能显示图片 3.不同点 UIButton能 ...
- Js获取Gridview中Dropdownlist选中状态
在Gridview中加入Dropdownlist模板列,加入DropDownlist 是一种常用的操作,其中涉及到如何获取选择项和Gridview重新绑定两个要点. 如图 前台代码如下 <%@ ...
- html li css选中状态切换
思路:点击当前li元素后是用removeClass()删除所有兄弟元素(使用siblings()获取)的class样式,然后使用addClass()为当前li添加class. 具体演示如下: 1.HT ...
- iOS开发 tabBarController选中状态
self.tabBarController.selectedIndex = 0; // 默认是0:
- ios 清除列表选中状态
[tableView deselectRowAtIndexPath:indexPath animated:YES];
随机推荐
- Tomcat 配置问题总结
本人是一个前端屌丝儿,最近没事研究了一下tomcat的部署问题,一下列几个实用的小技能(直接上干货了,不赘述): 1,路径引用部署 在tomcat目录下的conf/Catalina/localhost ...
- NOI2002robot
这题又是纯数论题…… 独立数就是欧拉函数,政客和军人的含义已经说的很清楚了,学者是最多的…… 首先,如果我们知道了政客和军人的答案,那就只要用n的所有因子的欧拉函数值减去这两个值,然后取模就行了. 但 ...
- 我个人有关 Azure 网络 SLA、带宽、延迟、性能、SLB、DNS、DMZ、VNET、IPv6 等的 Azure 常见问题解答
Igor Pagliai(微软) 2014 年 9月 28日上午 5:57 年 11 月 3 年欧洲 TechEd 大会新宣布的内容). 重要提示:这篇文章中我提供的信息具有时间敏感性,因为这些 ...
- Java框架的思考
目前的JAVA 企业级开发框架,我们常用的大致包括IOC AOP MVC ORM框架 1. IOC spring是一个非常棒的ico容器,其思想非常简单,用一个集合对象如MAP 来缓存对象(对象都是单 ...
- 白话spring依赖注入
Spring能有效地组织J2EE应用各层的对象.Action?Service?DAO?,都可在Spring的管理下有机地协调.运行.Spring将各层的对象以松耦合的方式组织在一起,对象与对象之间没有 ...
- VirtualBox Headless启动虚拟机
习惯了在Windows上来学习和娱乐,所以不能切换到Linux系统. 为了Linux编程,我首先尝试了wubi在Windows上安装双系统,但是发现本来启动很快的Windows8安装了双系统之后,系统 ...
- error C2065:未声明的标识符错误
原文地址:http://blog.sina.com.cn/s/blog_8216ada701017evx.html 在VS2010下进行VC++调试时,出现这样一种错误:error C2065:未声明 ...
- uva 11916 Emoogle Grid
题意:用K种颜色给一个N*M的格子涂色.其中有B个格子是不能涂色的.涂色时满足同一列上下紧邻的两个格子的颜色不同.所有的涂色方案模100000007后为R.现在给出M.K.B.R,求一个最小的N,满足 ...
- 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇04:如何实现触控操作》
4.如何实现触控操作 触控操作概述: 随着APPLE.Samsung.SONY等众多公司,将掌机.电脑和手机等产品在触控领域的不断探索,以触控为操作的机型越来越多的被投放到市场当中.触控游戏.触控软件 ...
- leetcode@ [303/304] Range Sum Query - Immutable / Range Sum Query 2D - Immutable
https://leetcode.com/problems/range-sum-query-immutable/ class NumArray { public: vector<int> ...