自定义UIButton
偶尔逛简书能看见很多值得记下来的东西,有的接触过有的没接触过,接触过的也可能过段时间就忘记了,再上手的时候可能手足无措,所以决定有些觉得值得记下来的东西还是记录一下。博客是个好地方,因为很多人都能搜索到,所以迫使自己要认真点写,不然就很丢人了,所以在这里记录一些东西可能是对自己而言以后再次翻看最清晰的记录了,推荐大家都可以写一下,就当做笔记了,这样比收藏别人的文章更好,因为别人的思路转换为自己的东西还是需要一个过程的,自己把自己的领悟写下来就是这个过程。
写了这么多废话,下面开始主题了:
第一种方式:子类重新布局
很简单就直接上代码了:
继承UIButton,我常用的类前缀是AT,所以自定义按钮就是ATButton了,我们在ATButton重写layoutSubviews方法。
一般常见的样式就是图片在上文字标题在下,或者图片在右标题文字在左,图片在右文字在左就不用说了吧,默认样式,图片在下文字在上至今没见过,不过也不难实现,但是这里就不写了,只写前两种,会了前两种最后一种也就不难懂了。
图片在上文字标题在下
ATButton.m
//更改上下方向图片和文字的位置
- (void)layoutSubviews{
[super layoutSubviews]; CGRect imageRect = self.imageView.frame;
imageRect.origin.x = self.frame.size.width * 0.5 - imageRect.size.width * 0.5;
imageRect.origin.y = self.frame.size.height * 0.5 - imageRect.size.height; CGRect titleRect = self.titleLabel.frame;
titleRect.origin.x = self.frame.size.width * 0.5 - titleRect.size.width * 0.5;
titleRect.origin.y = self.frame.size.height * 0.5 ; self.imageView.frame = imageRect;
self.titleLabel.frame = titleRect;
}
控制器:
ATButton *btn = [[ATButton alloc] init];
[btn setBackgroundColor:[UIColor greenColor]];
[btn setFrame:CGRectMake(, , , )];
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
效果图:
图片在右文字标题在左
ATButton.m
//更改左右方向图片和文字的位置
- (void)layoutSubviews
{
[super layoutSubviews]; CGRect imageRect = self.imageView.frame;
imageRect.origin.x = self.frame.size.width * 0.5 ;
imageRect.origin.y = self.frame.size.height * 0.5 - imageRect.size.height * 0.5; CGRect titleRect = self.titleLabel.frame;
titleRect.origin.x = self.frame.size.width * 0.5 - titleRect.size.width;
titleRect.origin.y = self.frame.size.height * 0.5 - titleRect.size.height * 0.5; self.imageView.frame = imageRect;
self.titleLabel.frame = titleRect; }
控制器:
ATButton *btn = [[ATButton alloc] init];
[btn setBackgroundColor:[UIColor greenColor]];
[btn setFrame:CGRectMake(, , , )];
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
效果图:(我都是让它们居中显示的,如果你想改的话调一下位置也很容易)
第二种方式:EdgeInsets(不需要创建子类直接在控制器两行代码更改位置)
图片在右文字标题在左
UIButton *btn = [[UIButton alloc] init];
[btn setBackgroundColor:[UIColor greenColor]];
[btn setFrame:CGRectMake(, , , )];
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
btn.imageEdgeInsets = UIEdgeInsetsMake(, btn.frame.size.width * 0.5, , );
btn.titleEdgeInsets = UIEdgeInsetsMake(, -btn.frame.size.width + (btn.frame.size.width * 0.5 - btn.titleLabel.frame.size.width), , );
[self.view addSubview:btn];
效果图:
图片在上文字标题在下
UIButton *btn = [[UIButton alloc] init];
[btn setBackgroundColor:[UIColor greenColor]];
[btn setFrame:CGRectMake(, , , )];
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
btn.imageEdgeInsets = UIEdgeInsetsMake(-(btn.imageView.frame.size.height),btn.frame.size.width * 0.5 - btn.imageView.frame.size.width * 0.5, , );
btn.titleEdgeInsets = UIEdgeInsetsMake(, -btn.titleLabel.frame.size.width * 0.5, -(btn.titleLabel.frame.size.height), );
[self.view addSubview:btn];
效果图:
OK,就是这么多了,最后说一下UIEdgeInsetsMake():它的参数顺序有点奇怪,是上左下右,怎么用呢?这么记比较简单:比如说你想让按钮中的图片向左移10,你就在第二个参数写10,前面加负号就OK了,其他位置都一样,这样用比较容易理解一些,也比较容易记。
github:https://github.com/alan12138/Custom-Control
自定义UIButton的更多相关文章
- IOS实现UIButton图文混排、自定义按钮按下和正常状态下不同的背景颜色、根据文字长度自定义UIButton长度
在一些项目中,我们需要自定义自己的UIButton,使Button上面同时具有图片和文字描述,实现自定义UIButton的图文混排. 首先我们需要定义一个继承自UIButton的类,同时实现自己的in ...
- iOS 自定义UIButton(图片和文字混合)
// UIApplicationDelegate .h文件 #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder &l ...
- iOS 自定义UIButton
工作中有一个点击button更新button上文案的需求,用自定义了button可以很简单的实现的这个需求 首先写个自定义的button CustomButton.h #import <UIKi ...
- 第二十篇、自定义UIButton(设置title和image的位置)
#import "CustomButton.h" #define ImageW 15 #define ImageH 15 #define KRadio 0.75 @implemen ...
- 自定义UIButton 实现图片和文字 之间距离和不同样式
喜欢交朋友的加:微信号 dwjluck2013 1.UIButton+ImageTitleSpace.h #import <UIKit/UIKit.h> // 定义一个枚举(包含了四种类型 ...
- ios自定义UIButton内部空间Rect
- 关于UIButton嵌入到UIView点击无反应问题的解决方法和delegate的简单用法示例(转载)
做项目封装UIView的时候碰到的问题,没想到有个哥们儿还写成博客,特此收藏! 问题是这样的,几个界面用到同一个自定义返回按钮,于是就想着把这个按钮单独封装起来,添加一个UIView类,在里面自定义U ...
- ios控件自定义指引
转载自:http://bbs.9ria.com/thread-256747-1-1.html 一直以来都想写点什么,做点有意义的事,从今天开始我将会把自己在这一年的学习和应用IOS开发中的学习心得和体 ...
- iOS-UI控件之UIButton
---恢复内容开始--- UIButton 既可以显示图片,又可以显示文字,还能随时调整内部位置 系统自带尺寸 storyboard内部调整UIButton属性 状态 监听按钮点击事件 凡是继承自UI ...
随机推荐
- .net 下新版highcharts本地导出图片bug处理
最近公司要用到highcharts这个插件来生成图表,所以我花了点时间研究了下. 现在最新的版本是3.0.2,这js插件居多优点就不比多说了,demo官网上也很详细.但是优点不爽的地方是,导出图片这个 ...
- C++ 控制台代码输出控制
在C++控制台应用程序中可以控制控制台输出的字体颜色和 接受任意按键退出 #ifndef CONSOLE_UTILS_H #define CONSOLE_UTILS_H #include <wi ...
- 安卓动态调试七种武器之孔雀翎 – Ida Pro
安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...
- ABP理论学习之启动配置
返回总目录 本篇目录 配置ABP 配置模块 为模块创建配置 为了在应用启动时配置ABP和模块,ABP提供了一个基础设施. 配置ABP 配置ABP是在模块的PreInitialize事件中完成的.下面的 ...
- ABP框架理论学习之Hangfire集成
返回总目录 Hangfire是一个综合的后台工作管理者.你可以将Hangfire集成到ABP中,这样就可以不使用默认的后台工作管理者了.但你仍然可以为Hangfire使用相同的后台工作API.这样,你 ...
- 【BOOM】一款有趣的Javascript动画效果
实践出真知,有的时候看到一些有趣的现象就想着用自己所学的知识复现一下. boomJS 缘起 前几天在 github 上看到同事的一个这样的小项目,在 IOS 上实现了这样一个小动画效果,看上去蛮 ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- GUI - GEB UI库
最近基于Winform开发了几款产品,感觉Winform有很大的局限性,其最主要的一点在于:控件是基于Windows窗体的,这就导致每个控件都是重量级控件,对复杂的界面来说,其性能和表现力都欠佳.在实 ...
- Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
<Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...
- Java三大框架 介绍
三大框架:Struts+hibernate+spring Java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作 ...