iOS UIButton控件

article/2025/10/2 14:35:33

UIButtonUIControl的子类,实现了按钮功能,交互事件和控件状态可查看iOS UIControl控件。

1. 初始化

通过指定按钮类型来创建UIButton对象

+ (instancetype)buttonWithType:(UIButtonType)buttonType;

UIButtonType是一个枚举类型

说明
UIButtonTypeCustom按钮的外观行为主要依靠开发者的设置
UIButtonTypeSystemIOS系统默认的按钮风格
UIButtonTypeDetailDisclosure显示当前列表项的详情
UIButtonTypeInfoLight显示简短的说明
UIButtonTypeInfoDark显示简短的说明
UIButtonTypeContactAdd添加联系人

显示如下
在这里插入图片描述
按钮创建好之后,按钮的类型是不可以被修改,buttonType是只读属性。

2. 设置按钮样式

UIButton可以只设置一个UILabel或者一个UIImageView,也可以同时具有UILabelUIImageView,默认是图片在左,标题在右,而且imagetitle之间没有空隙。

// 设置按钮某状态下的标题
- (void)setTitle:(nullable NSString *)title forState:(UIControlState)state;
// 设置按钮某状态下的富文本标题
- (void)setAttributedTitle:(nullable NSAttributedString *)title forState:(UIControlState)state;// 设置按钮某状态下的文本颜色
- (void)setTitleColor:(nullable UIColor *)color forState:(UIControlState)state;
// 设置某状态下标题的阴影颜色
- (void)setTitleShadowColor:(nullable UIColor *)color forState:(UIControlState)state;// 设置某状态下的标题图片,图片不会被拉伸,原比例显示
- (void)setImage:(nullable UIImage *)image forState:(UIControlState)state;
// 设置某状态下的背景图片,图片会被拉伸,充满整个按钮
- (void)setBackgroundImage:(nullable UIImage *)image forState:(UIControlState)state

示例代码

- (void)viewDidLoad {[super viewDidLoad];self.btn = [UIButton buttonWithType:UIButtonTypeCustom];self.btn.frame = CGRectMake(20, 100, 320, 30);[self.btn setTitle:@"未选" forState:UIControlStateNormal];[self.btn setTitleColor:[UIColor convertStringToColor:@"#FFCACACA"] forState: UIControlStateNormal];[self.btn setImage:[UIImage imageNamed:@"choice"] forState:UIControlStateNormal];[self.btn setTitle:@"已选" forState:UIControlStateSelected];[self.btn setTitleColor:[UIColor convertStringToColor:@"#FFC19A79"] forState: UIControlStateSelected];[self.btn setImage:[UIImage imageNamed:@"choice_s"] forState:UIControlStateSelected];[self.btn addTarget:self action:@selector(singleTap:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:self.btn];
}- (void)singleTap:(id)sender {self.btn.selected = !self.btn.selected;
}

但当按钮被点击时,图片会显示高亮效果
在这里插入图片描述
我们可以设置一个高亮状态下的图片

[self.btn setImage:[UIImage imageNamed:@"choice"] forState:UIControlStateHighlighted];

虽然解决了高亮的问题,但当按钮被点击时,同样的问题又出现了,图片显示高亮效果,文字也同样被修改了。
在这里插入图片描述
这个高亮状态是UIControlStateSelected|UIControlStateHighlighted,这次我们不仅需要修改图片,还需要修改文字和颜色。

[self.btn setTitle:@"已选" forState:UIControlStateSelected|UIControlStateHighlighted];
[self.btn setTitleColor:[UIColor convertStringToColor:@"#FFC19A79"] forState: UIControlStateSelected|UIControlStateHighlighted];
[self.btn setImage:[UIImage imageNamed:@"choice_s"] forState:UIControlStateSelected|UIControlStateHighlighted];

效果如下
在这里插入图片描述
setTitleShadowColor方法要和UIButton.titleLabelsetShadowOffset方法配合使用
在这里插入图片描述
获取不同状态下显示

//  获取指定状态的标题
- (nullable NSString *)titleForState:(UIControlState)state;
//  获取指定状态的富文本
- (nullable NSAttributedString *)attributedTitleForState:(UIControlState)state;// 获取指定状态的标题颜色
- (nullable UIColor *)titleColorForState:(UIControlState)state;
// 获取指定状态的标题阴影颜色- (nullable UIColor *)titleShadowColorForState:(UIControlState)state;
// 获取指定状态的标题图片
- (nullable UIImage *)imageForState:(UIControlState)state;
// 获取指定状态的背景图片
- (nullable UIImage *)backgroundImageForState:(UIControlState)state;

我们也可以通过修改属性来设置不同状态下的显示

// 点击按钮时,图像是否变化,默认是YES
@property(nonatomic) BOOL adjustsImageWhenHighlighted;
// 该按钮被禁用时,图像是否变化,默认是YES
@property(nonatomic) BOOL adjustsImageWhenDisabled;
// 点击按钮时是否发光,默认是NO
@property(nonatomic) BOOL showsTouchWhenHighlighted

3. UIEdgeInsets属性

UIEdgeInsets是一个结构体,它的四个参数: top, left, bottom, right, 分别表示距离上边界,左边界,下边界,右边界的位移,默认值均为0。

typedef struct UIEdgeInsets {CGFloat top, left, bottom, right;
} UIEdgeInsets;

UIButtonUIEdgeInsets属性

// 按钮的内容整体进行偏移
@property(nonatomic) UIEdgeInsets contentEdgeInsets
// title的UIEdgeInsets属性的top,bottom,right都是相对于按钮的,left是相对于image
@property(nonatomic) UIEdgeInsets titleEdgeInsets;
// image的UIEdgeInsets属性的top,left,bottom都是相对于按钮的,right是相对于title
@property(nonatomic) UIEdgeInsets imageEdgeInsets;

示例代码

contentEdgeInsets = UIEdgeInsetsMake(10, 50, -10, -10)
titleEdgeInsets = UIEdgeInsetsMake(10, 50, 0, 0);
imageEdgeInsets = UIEdgeInsetsMake(0, 0, -10, 50);

显示如下
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Fhuuv19D.shtml

相关文章

UIButton基础

一、UIButton基础 与UILabel相同,UIButton对象也需要在ViewController中写一个创建函数来建立 UIButton对象的建立如下: //创建普通按钮函数 - (void) createUIRectButton {//创建一个btn对象,更具类型来创建btn//圆角类型btn:UIButtonType…

UIButton 基础

创建一个button 注意button只能通过类方法创建,不能使用alloc 该段代码添加在函数- (void)viewDidLoad 中 //通过类方法创建一个UIbuttonUIButton* btn [UIButton buttonWithType:UIButtonTypeRoundedRect] ;//设置按钮的位置btn.frame CGRectMake(100, 100, 100…

UIButton基础知识和自定义详解

UIButton是我们经常用的UI控件,继承UIControl。这里将对UIButton的基本使用方法和自定义UIButton进行详细介绍。 一、UIBUtton基本知识介绍 对于我们学习一个新的控件、无外乎两种方法。第一种是在xcode中的.m文件查看该控件的属性和相关方法,第二种直…

UI基本控件(二):UIButton

UIButton——按钮 作用:用户交互的主要控件,有六种类型,其中自定义类型使用最为普遍 属性: title属性:是按钮的文字 titleColor属性:是按钮的颜色 image属性:是按钮显示的图像 提示&#…

oracle 用impdp 导入dmp文件

百度整理如下 /*分为7步 */ /*第1步:创建临时表空间(注意:D:\Project\OracleTableSpace\FHADMIN\ 手动创建路径) */ create temporary tablespace C##FHADMIN_TEMP tempfile D:\Project\OracleTableSpace\FHADMIN\C##FHADMIN_TEMP.dbf size 50m a…

★Oracle imp/impdp 导入dmp文件到数据库

使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。 EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。 IMP只适用于EX…

Oracle:使用Impdp导入dmp文件的详细过程

完全转载自:https://www.cnblogs.com/afei1013/p/13123784.html 这一天为了导入这个Oracle的dmp文件,简直就是血泪史,因本人对Oracle并不是很会,随意踩了很多小白会踩的坑,因此特意记录一下过程,防备下次的…

Oracle expdp/impdp工具使用

Oracle数据泵 一、数据泵的作用: 1.实现逻辑备份和逻辑恢复 2.在数据库用户之间移动对象 3.在数据库之间移动对象 4.实现表空间转移 二 、数据泵的特点与传统导出导入的区别 1.EXP和IMP是客户段工具程序, EXPDP和IMPDP是服务端的工具程序 2.EXP和IMP效率…

impdp导入dmp文件

impdp命令在cmd下直接用,不必登录oracle。只能导入expdp导出的dmp文件。 expdp导出的时候,需要创建 DIRECTORY 导出什么表空间,导入也要什么表空间。 导出什么用户,导入也要什么用户。 如果没有要新建。 从杭州服务器expdp导出…

解决:impdp导入.dmp文件

首先创建一个新用户,保证和导出dmp文件时的用户名,密码以及对应的表空间名相同。 不多说,直接上图 (基本只用改下面备注中文部分,根据需求对应替换就行) 1.创建用户 create user 用户 identified by 口…

配置NAT实现外网主机访问内网服务器(Cisco)

假设你是某公司的网络管理员,公司只向ISP申请了一个公网IP,现公司的网站在内网,要求在互联网也可以访问公司网站。 192.168.1.2是Web服务器的IP地址(内网地址)。通过分析可知,需要将内网服务器IP转换成外网…

内网服务器设置代理访问外网

内网服务器设置代理访问外网 背景 首先需要两台云服务器,其中服务器A无公网IP,服务器B有公网IP。 AB公网IP/110.40.255.180内网IP172.17.64.11172.17.64.17 配置A代理 直接配置环境变量即可。 cd /etc/profile.d/ vim proxy.sh进入proxy.sh文件后&…

外网访问内网的FTP服务器

1. 背景简介 最近研究如何在内网搭架FTP服务器,同时要保证外网(公网)能访问的到。终成正果,但走了一些弯路,在此记下,以飨后人。 2. 基础知识 FTP 使用 2 个端口,一个数据端口和一个命令端口…

如何让外网访问本地WEB服务器

目前很多网站开发者安装了IIS或者Apache等Web服务器,可以把自己电脑配置成一以路由为中心的内网服务器。 本地服务器在内网测试是绰绰有余的,但是有些项目需要演示给异地的客户验收,而又赶不及把自己的网站放到服务器上面,这时我们…

内网主机通过外网地址访问内网服务器

网关设备一般都具有NAT功能,分别为源地址NAT、目标地址NAT,这两种功能应用比较普遍,各厂商都有很标准的实现方式。但是对于“内网主机通过外网地址访问内网服务器”这一场景,各厂商的实现不通,下面就这个场景,分别说一下各厂商的实现。1.华为2.华三内网用户通过NAT地址访…

关于外网访问本地服务器

我在网上查到的外网访问本地服务器的方式有两种: 第一种是通过内网穿透的技术实现的。 第二种是通过申请域名,申请空间,申请云服务器,搭建网站实现的。 ①内网穿透的方式实现外网访问本地服务器 选择合适的内网穿透的工具 花…

【Linux-Windows】关于外网访问内网服务器

【Linux-Windows】关于外网访问内网服务器 1、背景2、内网穿透 1、背景 有时候,我们搭建的服务器系统是在内网,内网即内部局域网。 内网可以访问外网,但是外网不能访问内网,外网即互联网或者称为公网。 内网的设备往往组成模式如…

ssh外网访问内网服务器

现在有这样一个情况,实验室有自己的服务器(内网),并且有相关老师进行维护(公网),我们可以在内网用内网ip访问服务器,如果我们在家里只能通过公网进行登录。但是我在实验室有一个小服…

公网访问本地内网web服务器【内网穿透】

随着科技进步和时代发展,计算机及互联网已经深深融入我们的生活和工作,与之对应的,对计算机及网络的探索,让其为我们的生活增添色彩和乐趣,也成为很多人的业余爱好,而自行发布一个网站,就是这一…

搭建可通过外网访问的内网服务器

这是本人,第一次写博客,文采不好,技术也菜鸟,请不要见怪。 前一段时间裸辞了,于是开始广投简历。可是现实是非常的残酷,年底了面试的通知很少。想着是不是自己的简历上干货太少了,不如把自己之…