IOS实现UIButton图文混排、自定义按钮按下和正常状态下不同的背景颜色、根据文字长度自定义UIButton长度
在一些项目中,我们需要自定义自己的UIButton,使Button上面同时具有图片和文字描述,实现自定义UIButton的图文混排。
首先我们需要定义一个继承自UIButton的类,同时实现自己的initWithFrame:方法。方法声明在这个类的头文件中。
self = [super initWithFrame:frame];
if (self) { }
return self;
在if判断语句中,我们可以实现对按钮的一些自定义属性和方法,如按钮圆角、Title文本、背景颜色等信息。
如
self.titleLabel.textAlignment=NSTextAlignmentLeft;
这些都可以根据自己的需要进行简单设置。
为了上面一些简单的设置当然不需要自定义一个类,所以下面gc来了!!!!!
假如需要根据UIButton 的文字内容自适应调整UIButton的长度,需要以下几步:
1.首先自动获取文本的长度,
NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:]};
titleTextSize = [self.titleLabel.text boundingRectWithSize:CGSizeMake(MAXFLOAT, self.frame.size.height) options:NSStringDrawingTruncatesLastVisibleLine attributes:attribute context:nil].size;
[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, titleTextSize.width + cornerRedius* +self.frame.size.height , self.frame.size.height)];
上面方法得到的size就是根据系统设置字体大小,所获得的文字长度和高度的size。获取后重新调用setFrame方法,重新定义自己的Frame大小,就实现了自适应大小。
2.自定义图片显示位置和文字显示位置
[self setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
使用这个方法设置了UIImage后,你会发现,图片和文字可能不是你想要的,这个时候,需要重写UIButton类的两个方法,如下:
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
CGFloat titleW = contentRect.size.width - btnCornerRedius;
CGFloat titleH = self.frame.size.height;
CGFloat titleX = self.frame.size.height + btnCornerRedius;
CGFloat titleY = ;
contentRect = (CGRect){{titleX,titleY},{titleW,titleH}};
return contentRect; } - (CGRect)imageRectForContentRect:(CGRect)contentRect
{
CGFloat imageW = self.frame.size.height -;
CGFloat imageH = self.frame.size.height -;
CGFloat imageX = btnCornerRedius;
CGFloat imageY = 2.5;
contentRect = (CGRect){{imageX,imageY},{imageW,imageH}};
return contentRect; }
这里的btnCornerRedius是我定义的圆角弧度。
重写这两个方法后,图片的高度和文字的位置就在你的掌控之内了。
3、设置Button 的背景颜色。当你需要设置UIButton在按下状态和普通状态的不同的颜色,可以使用以下方法:
- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
使用此方法构建一个指定颜色的两张图片,然后加载在UIButton的
setBackgroundImage方法中,就可以实现按钮在按下后不同的两种颜色的显示。
本文中设置方法为:
[self setBackgroundImage:[self imageWithColor:[UIColor colorWithHexString:btnNormalStateHEXCorlor]] forState:UIControlStateNormal];
[self setBackgroundImage:[self imageWithColor:[UIColor colorWithHexString:btnSelectedHEXCorlor]] forState:UIControlStateHighlighted];
注意,上面这段代码的colorWithHexString:是一个颜色十六进制格式转化为UIColor的红绿蓝格式的方法,在网上可以搜到,或者直接在
imageWithColor的方法中传入UIColor。
IOS实现UIButton图文混排、自定义按钮按下和正常状态下不同的背景颜色、根据文字长度自定义UIButton长度的更多相关文章
- iOS支持图文混排的按钮(UIButton)
创建UIButton子类 直接上代码了 .h文件 创建UIButton子类 直接上代码了 .h文件 #import <UIKit/UIKit.h> @interface GraphicBt ...
- IOS总结_实现UIButton的图文混排(二)
非常久没有写博客了,之前写过一篇关于UIButton图文混排的,可是有点复杂,今天来一个比較简单地.相信大家回用得着 UIButton *button=[[UIButton alloc, , )]; ...
- CoreText 实现图文混排
CoreText 实现图文混排 相关博文推荐 IOS CoreText.framework - 基本用法 IOS CoreText.framework - 段落样子CTParagraphStyle h ...
- 【iOS】使用CoreText实现图文混排
iOS没有现成的支持图文混排的控件,而要用多个基础控件组合拼成图文混排这样复杂的排版,是件很苦逼的事情.对此的解决方案有使用CoreText进行绘制,或者使用TextKit.本文主要讲解对于CoreT ...
- iOS火焰动画效果、图文混排框架、StackView效果、偏好设置、底部手势等源码
iOS精选源码 高性能图文混排框架,构架顺滑的iOS应用. 使用OpenGLE覆盖阿尔法通道视频动画播放器视图. 可选最大日期截至当日日期的日期轮选器ChooseDatePicker 简单轻量的图片浏 ...
- ios图文混排
图文混排的形式 1. 富文本形式 2. core Text(文字排版) 3. TextKit 4. UIWebView 一.富文本 我们可以采用attributeString来进行图文混排.例如一个文 ...
- 高性能图文混排框架,构架顺滑的iOS应用-b
About GallopGallop是一个功能强大.性能优秀的图文混排框架. Features主要用于解决以下需求: 滚动列表的性能优化.Gallop使用异步绘制.视图层级合并.观察mainRunlo ...
- 自定义图文混排视图MyImageTextView
http://blog.csdn.net/xujunfeng000/article/details/36399339?utm_source=tuicool&utm_medium=referra ...
- ios开发--图文混排(富文本)
最近准备接一个编辑类的app,所以就查了下相关的功能,并自己试验了下: /** iOS 6之前:CoreText,纯C语言,极其蛋疼 iOS 6开始:NSAttributedString,简单易用 i ...
随机推荐
- 1.9 需求订单导入MDS
1.9 需求订单导入MDS 1.9.1 业务方案描述 将”需求订单维护表”中完成调整维护的需求订单导入系统标准MDS中,使之驱动对应的物料需求计划(MRP)的运行. 1.9.2 ...
- error C3861: “gets”: 找不到标识符
error C3861: “gets”: 找不到标识符 解决办法: 把“gets”改成“gets_s”
- 通过iframe在其父窗口中打开隐藏元素
先上代码 $(".login-box,#dl,.top_01 a:eq(1)").click(function(){ if(self!=top){ parent.$("# ...
- Flash,EEPROM差别
flash是用来存储代码的,在执行过程中不能改:EEPROM是用来保存用户数据,执行过程中能够改变,比方一个时钟的闹铃时间初始化设定为12:00,后来在执行中改为6:00,这是保存在EEPROM里,不 ...
- 单例模式 GetInstance()
如何设计一个含GetInstance()函数的类 直接上代码: 头文件(MyClass.h): class CMyClass { public: CMyClass(void); ~CMyClass(v ...
- JavaScript之充实文档的内容
1.我们在平时的开发中会碰到一些缩略语如:XML,HTML,API等专业术语:为了能使用户,更好的了解术语的意思,我们通常会给<abbr></abbr>标签加一个title属性 ...
- android退出activity的方式总结(一)
在android中使用:[activityname].this.finish(); 只是退出了activity的堆栈中,要真正的退出程序在手机cpu中的运行,当应用不再使用时,通常需要关闭应用,可以 ...
- Vijos 1493 传纸条
此题,刚开始看上去以为是加简单的动态规划,但是写了后,交上去发自现不对.后来在网上查了题解后发现用到了“多线程DP”的东西.这种DP就是用来解决这种问题的.和P1143 三取方格数那道题很像.只不过是 ...
- 常用的Linux操作命令(一)
ls 目录 mkdir 创建文件夹 vi 新建文件 :w filename 将文章存入指定的文件名filename :wq 保存并退出编辑文件 :q! 强制离开并放弃编辑的文件 cd 切换到目录/ro ...
- python中,str和repr的区别
str函数,它会把值转换为合理形式的字符串,以便用户可以理解. repr会创建一个字符串,它以合法的Python表达式的形式来表示值. 例如: >>> print repr(&quo ...