在一些项目中,我们需要自定义自己的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长度的更多相关文章

  1. iOS支持图文混排的按钮(UIButton)

    创建UIButton子类 直接上代码了 .h文件 创建UIButton子类 直接上代码了 .h文件 #import <UIKit/UIKit.h> @interface GraphicBt ...

  2. IOS总结_实现UIButton的图文混排(二)

    非常久没有写博客了,之前写过一篇关于UIButton图文混排的,可是有点复杂,今天来一个比較简单地.相信大家回用得着 UIButton *button=[[UIButton alloc, , )]; ...

  3. CoreText 实现图文混排

    CoreText 实现图文混排 相关博文推荐 IOS CoreText.framework - 基本用法 IOS CoreText.framework - 段落样子CTParagraphStyle h ...

  4. 【iOS】使用CoreText实现图文混排

    iOS没有现成的支持图文混排的控件,而要用多个基础控件组合拼成图文混排这样复杂的排版,是件很苦逼的事情.对此的解决方案有使用CoreText进行绘制,或者使用TextKit.本文主要讲解对于CoreT ...

  5. iOS火焰动画效果、图文混排框架、StackView效果、偏好设置、底部手势等源码

    iOS精选源码 高性能图文混排框架,构架顺滑的iOS应用. 使用OpenGLE覆盖阿尔法通道视频动画播放器视图. 可选最大日期截至当日日期的日期轮选器ChooseDatePicker 简单轻量的图片浏 ...

  6. ios图文混排

    图文混排的形式 1. 富文本形式 2. core Text(文字排版) 3. TextKit 4. UIWebView 一.富文本 我们可以采用attributeString来进行图文混排.例如一个文 ...

  7. 高性能图文混排框架,构架顺滑的iOS应用-b

    About GallopGallop是一个功能强大.性能优秀的图文混排框架. Features主要用于解决以下需求: 滚动列表的性能优化.Gallop使用异步绘制.视图层级合并.观察mainRunlo ...

  8. 自定义图文混排视图MyImageTextView

    http://blog.csdn.net/xujunfeng000/article/details/36399339?utm_source=tuicool&utm_medium=referra ...

  9. ios开发--图文混排(富文本)

    最近准备接一个编辑类的app,所以就查了下相关的功能,并自己试验了下: /** iOS 6之前:CoreText,纯C语言,极其蛋疼 iOS 6开始:NSAttributedString,简单易用 i ...

随机推荐

  1. 自绘Tab控件

    自绘tab按钮效果图如下: 使用例子: MyTabControl *tabControl = NULL; tabControl = new MyTabControl();tabControl-> ...

  2. Hibernate get 和load的区别

    1 load是要用的时候才从数据库去查询,get 是马上查询. 2 对于不存在的记录,get会报空指针异常,load会报 org.hibernate.ObjectNotFoundException:  ...

  3. poj1528---(数论)

    题意:一个数除了自身以外的所有因数相加,得到的数如果小于自身,输出deficient,否则输出abundant,如果相等,输出perfect 这道题核心:求一个数的所有除本身之外的因数的和 ,i; ; ...

  4. html学习笔记一

    学习了一天,总结巩固下自己收获. html是超文本标记语言,而不是编程语言. 1:html结构 包含html标签,head标签,title标签,body标签. <html> <hea ...

  5. Android解析XML

    在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...

  6. 1.对于.NET的初步理解和介绍

    好久没写博客了,最近心情比较low,不知道为什么.很流行的一个问题叫做:如果你明天就挂了,那么你最后悔的事情将会是什么.我想了两个月,答案是不知道,无所谓.这样不好,那这个问题先放一边吧,我们开始这一 ...

  7. 有关android源码编译的几个问题

    项目用到编译环境,与源码有些差异不能照搬,关键是连源码都没编译过,下面基本上是行网上照的各种自学成才的分享,病急乱投医了,都记在下面作为参照吧. 1.验证是否编译正确,在终端执行 emulator & ...

  8. cocostudio导出plist文件

    今天在用Armature类时用到cocostudio导出文件,由于美术的原因他使用的是中文命名法(这你敢相信),后面在导入程序中跟了下代码发现是解析plist文件有误,我就来比较正常功能文件和有错文件 ...

  9. Java动态代理机制——JDK

    动态代理机制是Spring AOP编程的原理基础. JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类.如PersonImpl得实现Person接口,才能用JDK动态代理机制. 定义一 ...

  10. OSCache缓存框架介绍

          OSCache是一种开放性的JSP定制标记应用,由OpenSymphony设计,提供了在现有JSP页面之内实现快速内存缓冲的功能. OSCache是个一个广泛采用的高性能的J2EE缓存框架 ...