关于uibutton织梦栏目选中状态高亮和高亮状态的区别

& & & 先科普以下常识:简单来看,按钮有点击、非点击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各行做不同程度的修改,运行后点击按钮会看到不同的效果。
&注释掉第b行,点击按钮不放,显示高亮状态金色图片,松开恢复正常状态的灰色图片。这点容易理解。
&注释掉第b行,注释掉第c行,点击按钮,按钮无任何变化。因为[super setHighlighted:highlighted]是设置高亮状态,注释掉后,方法内并没有做任何事,所以不变。
&不做任何修改,点击按钮,按钮在原图片上加一层灰色。虽然调用了(setSelected:)方法,但因为没设置selected状态下背景图片,所以看到的只是变高亮的效果。
&将第a行的UIControlStateHighlighted改为 UIControlStateSelected,点击时为原图片加一层灰色的高亮,松开手转换为选中状态的金色图片。如果想去掉高亮状态,注释掉第c行即可,点击直接变金色图片。
注意:如果把第e行UIControlEventTouchDown改成UIControlEventTouchUpInside,应用在上述4种情况时会显示效果会有一点差别,原因估计就在UIControlEventTouchDown是点击了就调用方法buttonClick:,而UIControlEventTouchUpInside是在松开手后才调用,具体效果大家可以自己试试。3373人阅读
说来惭愧,搞Ios也快一年了,这个居然不知道,刚才在网上搜了一会,也没有搜明白 ,现在在群里问一个兄弟,人家说的很清楚,现在记下来:
选中可以常态,高亮状态在Down才有效,up时候状态无效
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2090582次
积分:21826
积分:21826
排名:第287名
原创:413篇
转载:613篇
评论:99条
(2)(2)(2)(7)(7)(3)(2)(1)(2)(2)(6)(4)(3)(4)(12)(4)(17)(9)(5)(11)(7)(22)(3)(12)(38)(32)(20)(5)(17)(35)(10)(24)(15)(8)(28)(13)(11)(28)(26)(20)(43)(55)(13)(14)(25)(12)(19)(37)(64)(29)(31)(7)(30)(12)(45)(19)(17)(23)(8)(11)(36)UIButton详解
我的图书馆
UIButton详解
第二篇文章来学习UIButton,这是一个我们最常用的控件之一,可往往最常用的却还有很多不了解的东西,苹果也为这个控件设计了很多有意思的东西。
首先还是,storyboard属性:
Type:Custom:自定义风格(无边框的那种);system:圆角矩形(系统的那种);DetailDisclosure:蓝色小箭头按钮,主要做详细说明用(ios7上变成一个亮的蓝色感叹号);InfoLight:亮色感叹号;InfoDark:暗色感叹号;ContactAdd:十字加号按钮;State Config:Default:常规状态显现;Highlighted:高亮状态显现;Selected:选中状态;Disabled:禁用的状态才会显现.Title:plain常规的。attributed属性可以更改一个label文字中不同的颜色。font:改变文字字体和文字大小;Text
Color:改变字体颜色;Shadow Color:阴影颜色;
Image:摁钮图片显示;Background:背景图片;Shadow Offset:阴影大小;Drawing:Reverse On Highlight:阴影在雕刻和浮雕外观之间翻转,默认为NO(翻译不准确,原文:default
is NO. if YES, shadow reverses to shift between engrave and emboss appearance);Shows Touch On Highlight:下面的这个属性设置为yes的状态下,按钮按下会发光,默认为NO;HighlightedAdjusts
Image:当按钮高亮的情况下,图像的颜色会被画深一点,默认为YES。Disabled Adjusts Image:当按钮禁用的情况下,图像的颜色会被画深一点,默认为YES。line breaks:文字剪裁方式。Clip:简单剪裁,到边界为止;CharWrapping:保留整个字符;WordWrapping:以空格为边界,保留单词;TruncatingHead:按照"......文字"显示;TruncatingTail:按照"文字......文字"显示;TruncatingMiddle:按照"文字......"显示.Edge:这个是设置摁钮上的文字或者图片在摁钮上的相对位置的。可以一起设置,也可以分别选择Image和Title,分别设置。下面是Inset是设置的坐标。成型之后可以设置成这个样子的。可以图片上即存在图标又存在文字,这样比用整体贴图要好。Control:Alignment:设置对齐位置默认都是居中;Content:当前摁钮的状态:selected:选中;Enable:是否正在启用;Highlight:是否高亮;View:这是摁钮下面的一个自带的view的属性。设置这个同时也就设置了这个Button。如设置了这个Alpha或者Hidden,或者设这tag也就是设置这个Button。
1.创建一个圆角矩形的按钮
[objc] UIButton&*button1&=&[UIButton&buttonWithType:UIButtonTypeRoundedRect];&&
2.button类型有以下6种,
[objc] typedef&NS_ENUM(NSInteger,&UIButtonType)&{&&&&&&UIButtonTypeCustom&=&0,&&&&&&&&&&&&&&&&&&&&&&&&&//&no&button&type&&&&&&UIButtonTypeSystem&NS_ENUM_AVAILABLE_IOS(7_0),&&//&standard&system&button&&&&&&&&UIButtonTypeDetailDisclosure,&&&&&&UIButtonTypeInfoLight,&&&&&&UIButtonTypeInfoDark,&&&&&&UIButtonTypeContactAdd,&&&&&&&&&&&&UIButtonTypeRoundedRect&=&UIButtonTypeSystem,&&&//&Deprecated,&use&UIButtonTypeSystem&instead&&};&&3.设置Button的frame:
[objc] button1.frame&=&CGRectMake(100,100,50,50);&&4.Button的状态展示:
[objc] 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)&span&style="white-space:pre"&&&&&&&/span&//&选中&&&&&&UIControlStateApplication&&=&0x00FF0000,&&&&&&&&&&&&&&//&additional&flags&available&for&application&use&//&当应用程序标志使用时&&&&&&UIControlStateReserved&&&&&=&0xFF000000&&&&&&&&&&&&&&&//&flags&reserved&for&internal&framework&use&span&style="white-space:pre"&&&&&&&&&&/span&//&为内部框架预留&&};&&
5.BUTTON每个状态时设置图片
[objc] [button1&setImage:[UIImage&imageNamed:@"image"]&forState:UIControlStateNormal];&&
6.为Button上面的文字title设置文本:
[objc] [button1&setTitle:@"BTN1"&forState:UIControlStateNormal];&&
7.为title设置颜色
[objc] [button1&setTitleColor:[UIColor&redColor]&forState:UIControlStateNormal];&&
8.为title设置阴影
[objc] [button1&setTitleShadowColor:[UIColor&grayColor]&forState:UIControlStateNormal];&&
9.设置背景图片
[objc] [button1&setBackgroundImage:[UIImage&imageNamed:@"PIC"]&forState:UIControlStateHighlighted];&&
10.显示或添加控件
[objc] [self.view&addSubview:button1];&&
11.添加动作
[objc] [button1&addTarget:self&action:@selector(btnPressed:)&forControlEvents:UIControlEventTouchUpInside];&&
[objc] -(void)btnPressed:(id)sender{&&&//sender就是那个按钮本身&&&&&&&&&&&&UIButton*&btn&=&(UIButton*)&&&&&&&&&&&&//开始写你自己的动作&&}&&
有关动作状态的声明
[objc] typedef&NS_OPTIONS(NSUInteger,&UIControlEvents)&{&&&&&&UIControlEventTouchDown&&&&&&&&&&&=&1&&&&&0,&&&&&&//&on&all&touch&downs&&&&&&UIControlEventTouchDownRepeat&&&&&=&1&&&&&1,&&&&&&//&on&multiple&touchdowns&(tap&count&&&1)&&&&&&UIControlEventTouchDragInside&&&&&=&1&&&&&2,&&&&&&UIControlEventTouchDragOutside&&&&=&1&&&&&3,&&&&&&UIControlEventTouchDragEnter&&&&&&=&1&&&&&4,&&&&&&UIControlEventTouchDragExit&&&&&&&=&1&&&&&5,&&&&&&UIControlEventTouchUpInside&&&&&&&=&1&&&&&6,&&&&&&UIControlEventTouchUpOutside&&&&&&=&1&&&&&7,&&&&&&UIControlEventTouchCancel&&&&&&&&&=&1&&&&&8,&&&&&&&&UIControlEventValueChanged&&&&&&&&=&1&&&&12,&&&&&//&sliders,&etc.&&&&&&&&UIControlEventEditingDidBegin&&&&&=&1&&&&16,&&&&&//&UITextField&&&&&&UIControlEventEditingChanged&&&&&&=&1&&&&17,&&&&&&UIControlEventEditingDidEnd&&&&&&&=&1&&&&18,&&&&&&UIControlEventEditingDidEndOnExit&=&1&&&&19,&&&&&//&'return&key'&ending&editing&&&&&&&&UIControlEventAllTouchEvents&&&&&&=&0x00000FFF,&&//&for&touch&events&&&&&&UIControlEventAllEditingEvents&&&&=&0x000F0000,&&//&for&UITextField&&&&&&UIControlEventApplicationReserved&=&0x0F000000,&&//&range&available&for&application&use&&&&&&UIControlEventSystemReserved&&&&&&=&0xF0000000,&&//&range&reserved&for&internal&framework&use&&&&&&UIControlEventAllEvents&&&&&&&&&&&=&0xFFFFFFFF&&};&&
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&iOS UIButton设置两种状态切换之间的效果 - 简书
iOS UIButton设置两种状态切换之间的效果
昨天,在公司的项目中,给UI在测试机上跑了一下项目,过了一会,UI拿着手机过来说按钮点击的颜色太深了,需要改一下。在这里,新建一个工程具体情况:
具体的情况.gif
// 按照按钮背景图片的大小来设置button的frame
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 36, 20.5)];
[button setBackgroundImage:[UIImage imageNamed:@"question_turn_off_back"] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:@"question_turn_on_back"] forState:UIControlStateSelected];
[button setImage:[UIImage imageNamed:@"question_turn_off"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"question_turn_on"] forState:UIControlStateSelected];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
- (void)buttonClicked:(UIButton *)button {
button.selected = !button.isS
在这里,按照平常的方法给按钮设置了默认状态下的 backgroundImage 和 image,还有选中状态下的 backgroundImage 和 image。发现按钮按下去之后,有一片灰色蒙板一样的东西,毋庸置疑,肯定是 UIButton 的 highlighted 属性搞的鬼。但是这里 UIButton 创建的时候使用 init 方式,记得MJ在视频里说过这样创建一个按钮就相当于 UIButtonTypeCustom类型的,但是还是去把按钮的创建方式改成 UIButtonTypeCustom ,其他的代码不变。
// 按照按钮背景图片的大小来设置button的frame
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 200, 36, 20.5);
UIButtonTypeCustom.gif
发现还是不好使,紧接着又设置 UIControlStateHighlighted 状态下的背景图片还是没用。在网上搜,但是没有找到(可能是搜索的方向有问题),由于项目紧,就又回到项目中去,跳入 UIControlState 中去查看,想看看有没有新的发现。
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal
UIControlStateHighlighted
// used when UIControl isHighlighted is set
UIControlStateDisabled
UIControlStateSelected
// flag usable by app (see below)
UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 && 3, // Applicable only when the screen supports focus
UIControlStateApplication
= 0x00FF0000,
// additional flags available for application use
UIControlStateReserved
= 0xFF000000
// flags reserved for internal framework use
这是苹果对 UIControlState 的定义,在这里发现它的类型是 NS_OPTIONS 类型,这种类型在 《Effective
Objective-C2.0编写高质量的iOS和OS
X代码的52个有效方法》 第1章第5条有描述:
《Effective
Objective-C2.0编写高质量的iOS和OS
X代码的52个有效方法》对 NS_OPTIONS 使用场景描述.png
既然它是 NS_OPTIONS 类型可以进行位运算,想起学校时期写单片机程序的时候,可以按照位运算来组合自己想要的一种状态。
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal
// 二进制 : 0000 十进制:0
UIControlStateHighlighted
// 1向左挪动0位
二进制 : 0001 十进制:1
UIControlStateDisabled
// 1向左挪动1位
二进制 : 0010 十进制:2
UIControlStateSelected
// 1向左挪动2位
二进制 : 0100
UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 && 3,
// 1向左挪动3位
二进制 : 1000
UIControlStateApplication
= 0x00FF0000,
UIControlStateReserved
= 0xFF000000
于是增加一行代码,设置默认和高亮状态这个过程的背景图片
[button setBackgroundImage:[UIImage imageNamed:@"question_turn_off_back"] forState:UIControlStateHighlighted | UIControlStateNormal];
UIControlStateHighlighted | UIControlStateNormal.gif
之前的效果:
之前的效果.gif
对比发现,按钮从默认状态到高亮状态的时候,没有那一层类似蒙板一样的东西了,只是 Image 还存在那种情况。于是再加上几句代码
// 设置背景图片在默认状态与高亮状态之间切换的图片
[button setBackgroundImage:[UIImage imageNamed:@"question_turn_off_back"] forState:UIControlStateHighlighted | UIControlStateNormal];
// 设置背景图片在选中状态与高亮状态之间切换的图片
[button setBackgroundImage:[UIImage imageNamed:@"question_turn_on_back"] forState:UIControlStateSelected | UIControlStateHighlighted];
// 设置图片在默认状态与高亮状态之间切换的图片
[button setImage:[UIImage imageNamed:@"question_turn_off"] forState:UIControlStateNormal | UIControlStateHighlighted];
// 设置图片在选中状态与高亮状态之间切换的图片
[button setImage:[UIImage imageNamed:@"question_turn_on"] forState:UIControlStateSelected | UIControlStateHighlighted];
最后的效果:
最后设置的效果.gif

我要回帖

更多关于 uibutton选中状态 的文章

 

随机推荐