本节知识点:

  1. 什么是UIButton
  2. UIButton的状态
  3. UIButton的属性设置
  4. UIButton基本使用步骤
  5. UIButton的代码创建与常用属性设置
  6. 重写按钮的某个状态属性的 setter 或 getter 方法设置按钮的状态
  7. 调整UIButton内部布局

1. 什么是UIButton

  1. 还有一个非常重要的UI控件---UIButton,俗称“按钮”
  2. 一般情况下,点击某个控件后,会做出相应反应的都是按钮
  3. 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置
  • 作用:监听用户的点击事件,在用户点击后做出响应


2. UIButton的状态

  • 1. normal(普通状态)

    • 默认情况(Default)
    • 对应的枚举常量:UIControlStateNormal
    • 除开UIControlStateHighlightedUIControlStateDisabledUIControlStateSelected以外的其他情况,都是normal状态
    • 这种状态下的按钮【可以】接收点击事件
    • 如果前后连着设置按钮同时处于多种状态, 则表现出来的也是 normal 状态, 除去如果有 设置为 enabled = NO; 则会进入UIControlStateDisabled状态(包括颜色), 不能点击
  1. //下面两种杂交在一起(就不是 normal 后面三种 ), 会显示为 Normal 状态的颜色,
  2. //但是 设置了 Enabled == NO, 所以这里也是不能点击的,
  3. self.button.selected = YES;
  4. self.button.enabled = NO;
  • 2. highlighted(高亮状态)

    • 对应的枚举常量:UIControlStateHighlighted
    • 【当按住按钮不松开】或者【highlighted = YES】时就能达到这种状态
    • 这种状态下的按钮【可以】接收点击事件
  • 3.selected (选中状态)

    • 对应的枚举常量: UIControlStateSelected
    • 【button.selected = YES】时就能达到这种状态
    • 这种状态下的按钮【可以】接收点击事件
  • 4. disabled(失效状态,不可用状态)

    • 如果enabled属性为NO,就是处于disable状态,代表按钮不可以被点击
    • 对应的枚举常量:UIControlStateDisabled
    • 【button.enabled = NO】时就能达到这种状态
    • 这种状态下的按钮【无法】接收点击事件
  • 5. 让按钮无法点击的2种方法

    • button.enabled = NO;

      • 【会】进入UIControlStateDisabled状态
    • **button.userInteractionEnabled = NO; **
      • 【不会】进入UIControlStateDisabled状态,继续保持当前状态

3. UIButton的属性设置

  • 设置按钮的背景图片

    • 设置按钮在不同状态下的背景图片(为了保证高亮状态下的图片正常显示,必须设置按钮的type为custom)

  • 按钮的样式type属性

    • 实际上,UIButton自带了很多种不同的样式

    • 知识点:Detail Disclosure/info Light/info Dark长一样(iOS7以前不一样,扁平化以后都一样,残留的东西)
  • UIButton的常见属性设置方法

  1. - (void)setTitle:(NSString *)title forState:(UIControlState)state;
  2. //设置按钮的文字
  3. - (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;
  4. //设置按钮的文字颜色
  5. - (void)setImage:(UIImage *)image forState:(UIControlState)state;
  6. //设置按钮内部的小图片
  7. - (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state;
  8. //设置按钮的背景图片
  9. //设置按钮的文字字体(需要拿到按钮内部的label来设置)
  10. btn.titleLabel.font = [UIFont systemFontOfSize:13];
  11. - (NSString *)titleForState:(UIControlState)state;
  12. //获得按钮的文字
  13. - (UIColor *)titleColorForState:(UIControlState)state;
  14. //获得按钮的文字颜色
  15. - (UIImage *)imageForState:(UIControlState)state;
  16. //获得按钮内部的小图片
  17. - (UIImage *)backgroundImageForState:(UIControlState)state;
  18. //获得按钮的背景图片

4. UIButton基本使用步骤

方法一

  • 1. 直接通过 storyboard 创建

    • 注意:自定义按钮type自动改成custom类型
  • 2. 拖线链接引用 UIButton 控件
  • 3. 设置相关属性

方法二

  • 1. 通过代码创建按钮的同时指定按钮样式
  • 2. 设置相关属性

5. UIButton的代码创建与常用属性设置

  • 代码创建
  1. // 1. 创建按钮
  2. UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  3. // UIButton *button = [[UIButton alloc]init];// 和上面一行代码等价
  4. // 注意:按钮创建好之后,按钮的类型是不可以被修改
  5. // button.buttonType = UIButtonTypeCustom ; // 错误写法,系统会报错
  6. // UIButtonTypeCustom:无类型,按钮的内容需要自定义:位置尺寸、背景色,等(如果没有自定义这些可能会看不到)
  7. // UIButtonTypeDetailDisclosure:
  8. // UIButtonTypeInfoLight:
  9. // UIButtonTypeInfoDark:
  10. // UIButtonTypeContactAdd:
  • 设置属性

    • 设置位置尺寸、图片、背景图片、标题、标题颜色,等
  1. // 2. 设置位置尺寸
  2. button.frame = CGRectMake(100, 200, 200, 50);
  1. // 3. 设置文字
  2. // 3.1 常态的文字
  3. [button setTitle:@"我是按钮" forState:UIControlStateNormal];
  4. // 3.2 高亮状态的文字
  5. [button setTitle:@"我是高亮按钮" forState:UIControlStateHighlighted];
  1. // 4. 设置字体颜色
  2. // 4.1 常态的字体颜色
  3. [button setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
  4. // 4.2 高亮状态的字体颜色
  5. [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
  1. // 4. 设置图片
  2. // 4.1 常态下的图片
  3. [button setImage:[UIImage imageNamed:@"like"] forState:UIControlStateNormal];
  4. // 4.2 高亮下的图片
  5. [button setImage:[UIImage imageNamed:@"like_pressed"] forState:UIControlStateHighlighted];
  1. // 5. 设置背景图片
  2. // 5.1 常态下的背景图
  3. [button setBackgroundImage:[UIImage imageNamed:@"buttongreen"] forState:UIControlStateNormal];
  4. // 5.2 高亮下的背景图
  5. [button setBackgroundImage:[UIImage imageNamed:@"buttongreen_hightlighted"] forState:UIControlStateHighlighted];
  1. // 6. 设置按钮点击状态, 默认就是YES ,NO 状态是不可点击
  2. button.enabled = YES;
  1. // 7. 将按钮添加入控制器view中
  2. [self.view addSubview:button];
  • 监听按钮点击

    • 只要按钮触发了UIControlEventTouchUpInside事件,就会调用self对象的buttonClick:方法
  1. // 8. 监听按钮点击事件
  2. //谁调用参数传的就是谁,这里button调用所以buttonClick:(参数){}传的就是button对象本身
  3. [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
  1. - (void)buttonClick:(UIButton *)button{}

6. 重写按钮的某个状态属性的 setter 方法和 getter 方法设置按钮的状态

  • 如: 重写按钮高亮get方法, 如果返回值是 yes , 则永远返回的是高亮状态, 如果返回值是 NO 则永远返回的是非高亮
  1. - (BOOL)isHighlighted{
  2. return NO;
  3. }
  • 重写按钮高亮 set 方法, 如果没有实现内部属性赋值(属性是父类定义的, 要调用父类的方法赋值), 则不会出现高亮状态

    • 如果给内部属性赋值为 Yes , 则会一直为 YES状态, 如果赋值为 NO, 则一直未 NO 状态
  1. - (void)setHighlighted:(BOOL)highlighted{
  2. [super setHighlighted:highlighted];
  3. }

7. 调整Button内部布局

  • 实现步骤

    • 自定义按钮->创建一个继承 UIButton 的子类(如:CDHButton)
    • 给自定义按钮中的子控件重新布局(有两种方法)
    • 方法一:要实现两个对象方法
  1. -(CGRecttitleRectForContentRect:(CGRect)contentRect{
  2. // 返回文字的frame
  3. }
  4. - (CGRect)imageRectForContentRect:(CGRect)contentRect{
  5. // 返回图片的frame
  6. }
  • 方法二:实现layoutSubViews方法
  1. - (void)layoutSubviews{
  2. [super layoutSubviews];
  3. // 插入需要设置位置尺寸的语句,并返回frame
  4. }
  • 设置是否调整图片的显示亮度

    • 设置属性
  1. // 设置在 Highlighted 状态点击时是否调整图片显示亮度
  2. @property(nonatomic) BOOL adjustsImageWhenHighlighted; // default is YES. if YES, image is drawn darker when highlighted(pressed)
  3. // 设置在disabled状态是否调整图片显示亮度
  4. @property(nonatomic) BOOL adjustsImageWhenDisabled; // default is YES. if YES, image is drawn lighter when disabled
  1. // 在disabled要不要调整显示的图片,当disabled的时候也不改变背景色
  2. self.adjustsImageWhenDisabled = NO;
  • 按钮的内边距

    • 设置内边距属性
  1. // 按钮内的子控件(图片和文字)的内边距,
  2. @property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR; // default is UIEdgeInsetsZero
  3. // 按钮内的子控件(文字)的内边距,
  4. @property(nonatomic) UIEdgeInsets titleEdgeInsets; // default is UIEdgeInsetsZero
  5. // 按钮内的子控件(图片)的内边距,
  6. @property(nonatomic) UIEdgeInsets imageEdgeInsets; // default is UIEdgeInsetsZero
  • 例子
  1. // 设置按钮内图片和文字内边距位置为(30,30),即是按钮内图片和文字一起右移30,下移30
  2. self.btn.contentEdgeInsets = UIEdgeInsetsMake(30, 30, 0, 0);
  3. // 设置按钮内文字内边距位置为(0,-30),即是按钮内文字上移30
  4. self.btn.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);
  5. // 设置按钮内图片内边距位置为(0,-30),即是按钮内图片上移30
  6. self.btn.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);

你真的会用UIButton吗? UIButton详细介绍的更多相关文章

  1. ios基础篇(三)——UIButton的详细介绍

    按钮UIButton是ios开发中最常见的控件之一,下面来介绍UIButton的详细内容: 一.UIButton的定义 UIButton *button=[[UIButton buttonWithTy ...

  2. ios开发——实用技术篇&Pist转模型详细介绍

    Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通 ...

  3. iOS开发——Swift篇&Swift关键字详细介绍

    Swift关键字详细介绍 每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension ...

  4. D触发器深入详细介绍(zhuanzai)

    D触发器深入详细介绍,D触发器是对输入时钟脉冲边沿信号敏感的装置.只有在检测到边沿信号,才设置输出信号与输入端D相同.一个基础的电平触发装置是门控D锁存器. D触发器(英文中“D”代表“Data”,“ ...

  5. bower 和 npm 的区别详细介绍

    摘要: 本文讲的是bower 和 npm 的区别详细介绍, 简单的说,npm是进行后端开发中,使用的模块安装工具,而bower,是前端的模块安装工具. 比如,在安装express,socket.io时 ...

  6. Linux操作系统中的文件目录结构详细介绍

    "/" :Linux文件系统的入口.也是最高一级的目录. "/bin":基本系统所需要的命令,功能和"/usr/bin"类似,这个目录下的文 ...

  7. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  8. [No0000A7]批处理经常用到的变量及批处理>NUL详细介绍

    绝对路径是指调用绝对的程序位置的路径,例如: start C:\Windows\test.exe 相对路径是文件改变路径以后还会按照变量的路径所在位置去调用,例如: start %WINDIR%\te ...

  9. linux配置网卡IP地址命令详细介绍及一些常用网络配置命令

    linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-- 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置 ...

随机推荐

  1. 数学(扩展欧几里得算法):HDU 5114 Collision

    Matt is playing a naive computer game with his deeply loved pure girl. The playground is a rectangle ...

  2. HDU 4565 So Easy!

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. MAT文件操作

    o李YZo 原文 MAT文件打开方法汇总及其他操作 MAT文件简介 为MATLAB使用的一种特有的二进制数据文件.MAT文件可以包含一个或者多个MATLAB 变量.MATLAB通常采用MAT文件把工作 ...

  4. 淘宝JAVA中间件Diamond详解(2)-原理介绍

    淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...

  5. POJ3241 Object Clustering 曼哈顿最小生成树

    题意:转换一下就是求曼哈顿最小生成树的第n-k条边 参考:莫涛大神的论文<平面点曼哈顿最小生成树> /* Problem: 3241 User: 96655 Memory: 920K Ti ...

  6. LR 常见问题总结

    问题1:Error: Two Way Communication Error:            Function two_way_comm_post_message/two_way_comm_p ...

  7. Linux Vi 删除全部内容,删除某行到结尾,删除某段内容 的方法

    1.打开文件 vi filename 2.转到文件结尾 G 或转到第9行 9G 3.删除所有内容(先用G转到文件尾) ,使用: :1,.d 或者删除第9行到第200行的内容(先用200G转到第200行 ...

  8. 4.4 CUDA prefix sum一步一步优化

    1. Prefix Sum 前缀求和由一个二元操作符和一个输入向量组成,虽然名字叫求和,但操作符不一定是加法.先解释一下,以加法为例: 第一行是输入,第二行是对应的输出.可以看到,Output[1] ...

  9. ACM2040

    关于亲和数的详细解释如下: http://www.kepu.net.cn/gb/basic/szsx/8/8_83/8_83_1004.htm /* 亲和数 时间限制:2000/1000 MS(JAV ...

  10. C/C++编译预处理命令详解【转】

    1.       预处理程序  按照ANSI标准的定义,预处理程序应该处理以下指令: #if #ifdef #ifndef #else #elif #endif #define #undef #lin ...