【原创】(IOS开发)highlighted和selected两种按钮状态原理摸索分享

先科普以下常识:简单来看,按钮有点击、非点击2个状态,点击时系统会自动调用设置按钮高亮状态的方法(setHighlighted);非点击时视为正常状态(normal)。我们可以根据需要给不同状态设置不同背景图片,苹果官方对按钮状态细致划分为3种:高亮(highlighted)、选中(selected)、普通(normal),如果编写代码时调用了方法(setSelected),按钮会呈选中状态(selected)。

3种按钮状态,苹果官方命名为:

UIControlStateNorma(正常)、UIControlStateHighlighted(高亮)、UIControlStateSelected(选中)

接下来将2张按钮背景图片作为讲解素材:

UIControlStateNorma 状态选用灰色图片TabBar

UIControlStateHighlighted 或 UIControlStateSelected 状态选用金色图片TabBarSel

再次强调下,按钮点击时,一定会调用系统方法(setHighlighted:),并显示为事先设置的高亮状态图片,如果之前没设置,默认显示效果为在原图片下加一层灰色。点击后只要没松开手,就会保持highlighted状态,松开手恢复显示normal状态。

现在看如下代码:

// 设置按钮图片背景

NSString  *name = [NSString  stringWithFormat:@"TabBar"];

[button  setBackgroundImage:[UIImage  imageNamed:name]   forState:UIControlStateNormal];

NSString  *selectedName = [NSString  stringWithFormat:@"TabBarSel" ];

[button  setBackgroundImage : [UIImage  imageNamed: selectedName]   forState : UIControlStateHighlighted];// 第a行

// 监听按钮点击

[button addTarget:self action:@selector(buttonClick:) forControlEvents: UIControlEventTouchDown]; // 第e行

// 点击按钮调用方法

- (void)buttonClick:(UIButton *)button

{

button.selected = YES; // 第b行

}

// 设置高亮状态方法

- (void)setHighlighted:(BOOL)highlighted

{

[super setHighlighted:highlighted];  // 第c行

}

// 设置选中状态方法

- (void)setSelected:(BOOL)selected

{

[super setSelected:selected];  // 第d行

}

代码讲解:

贴出的代码是精简版,能传达清楚意思即可。对a、b、c、d、e各行做不同程度的修改,运行后点击按钮会看到不同的效果。

  1. 注释掉第b行,点击按钮不放,显示高亮状态金色图片,松开恢复正常状态的灰色图片。这点容易理解。
  2. 注释掉第b行,注释掉第c行,点击按钮,按钮无任何变化。因为[super setHighlighted:highlighted]是设置高亮状态,注释掉后,方法内并没有做任何事,所以不变。
  3. 不做任何修改,点击按钮,按钮在原图片上加一层灰色。虽然调用了(setSelected)方法,但因为没设置selected状态下背景图片,所以看到的只是变高亮的效果。
  4. 将第a行的UIControlStateHighlighted改为 UIControlStateSelected,点击时为原图片加一层灰色的高亮,松开手转换为选中状态的金色图片。如果想去掉高亮状态,注释掉第c行即可,点击直接变金色图片。

注意:如果把第e行UIControlEventTouchDown改成UIControlEventTouchUpInside,应用在上述4种情况时会显示效果会有一点差别,原因估计就在UIControlEventTouchDown是点击了就调用方法buttonClick:,而UIControlEventTouchUpInside是在松开手后才调用,具体效果大家可以自己试试。

时间: 2024-12-28 09:37:20

【原创】(IOS开发)highlighted和selected两种按钮状态原理摸索分享的相关文章

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImageNamed-Xcode-master 提供快速创建自动注释:VVDocumenter-Xcode-master 2.使用介绍: (1)KSImageNamed-Xcode-master的使用 安装该插件后,会对文件中图片进行智能提示. (2)VVDocumenter-Xcode-master能提供

iOS开发CoreAnimation解读之三——几种常用Layer的使用解析

iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer 二.CAGradientLayer 三.CAReplicatorLayer 四.CAShapeLayer 五.CATextLayer iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer CAEmitterLayer是CoreAnimation框架中的粒子发射层,在以前的一片博客中有详细的介绍和范例,这里不再重复,地址如下: 粒

IOS开发隐藏键盘的4种方法

IOS开发隐藏键盘的4种方法 开发的app中常会用到键盘输入完成后隐藏键盘的情况.在此总结了4种方法来实现我们的目的. 方法一--delegate方式 第一种隐藏键盘的方法,称为delegate三步法: 1. 遵循(委托/代理); 2. 调用; 3. 关联头文件(ViewController.h)中遵循代理 . 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDel

Android开发中单元测试的两种方式

Android开发中单元测试的两种方式 一位优秀的程序员也同样不能保证自己的程序没有bug,因此编写合适的测试程序是完全有必要的,这样也会降低程序在后期出现各种奇奇怪怪bug的可能,降低维护成本,未雨绸缪将bug扼杀在摇篮之中. 看到网上有很多依旧用写java单元测试的方式在写android程序的单元测试程序--junit,当然我一直都反感将不合时宜的东西强搬到新的技术应用以获取一席之地的这种做法,不断的应用新的方法提高效率,完善程序才是真理!废话不多说,直接说到今天的重点:Android开发中

自定义php开发环境搭建以及两种方式的比较总结

php的开发环境搭建有两种,一种是自定义的方式,另一种是集成安装包的方式,后一个的难度要比第一个的搭建难度小的很多,就是直接安装的方式,具体的配置信息已经由别人处理好了,但是,第二种利用集成方式的却有着很大的诟病: 1:第一是,版本无法得到充分的更新,导致环境老化,以前觉得版本的新老和开发没有太大的关系,但后来才发现,老版本对于新生的流行技术支持力度是远远不够的,如php低于5.2的版本对于zend框架的支持会很弱,这可是要命的事,就意味着学不了框架....这么说,如果是自定义安装呢,可以大大的

MyBatis开发Dao层的两种方式(Mapper动态代理方式)

MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法. Mapper接口开发需要遵循以下规范: (1)Mapper.xml文件中的namespace与mapper接口的类路

ios 文字渐变色实现的两种方法

前段时间我写过一个文字渐变色的demo, 最近又在网上看到一个新的设置文字渐变色的方法, 就把这两种方法分享出来吧, 我认为应该还有好多种方法, 以后看到后再补充. 效果图: 其实这两种方法实现原理及思路是差不多的, 只是使用的类和方法不一样. (一)_ 自定义label, 实现 drawRect 方法, 在该方法里面画渐变色 思路: 1)_ 把label的文字画到context上去(画文字的作用主要是设置 layer 的mask) CGContextRef context = UIGraphi

【转】两种非对称算法原理:RSA和DH

转自:http://blog.chinaunix.net/uid-7550780-id-2611984.html 两种非对称算法原理:RSA和DH 虽然对称算法的效率高,但是密钥的传输需要另外的信道.非对称算法RSA和DH可以解决密钥的传输问题(当然,它们的作用不限于此).这两个算法的名字都是来自于算法作者的缩写,希望有朝一日能够出现用中国人命名的加密算法.非对称算法的根本原理就是单向函数,f(a)=b,但是用b很难得到a. RSA算法 RSA算法是基于大数难于分解的原理.不但可以用于认证,也可

iOS 开发之 - iOS6适配 - 导航栏按钮透明方法

首先上张图: 1:ios6导航栏默认按钮 rightBarButtonItem   是不是很丑的赶脚? 现在通过以下方法来改变以下:code: UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; rightButton.frame = CGRectMake(0, 0, 40, 40); [rightButton setTitle:@"提交" forState:UIControlStateNormal