IOS知识积累

UIButton实现图片和文字自定义排列

2017-10-15  本文已影响136人  张囧瑞

我们在开发的时候经常遇到一个需求就是需要创建一个按钮同时可以放图片和文字,实现这个需求可以有很多种方法:

UIButtonTop.png

所以这篇文章就写一下如何来摆放系统UIButton中的图片和文字。

准备

UIButton中有两个方法用来设置图片和按钮的边界约束:

@property(nonatomic)          UIEdgeInsets titleEdgeInsets;                
@property(nonatomic)          UIEdgeInsets imageEdgeInsets;                

通过设置这两个参数我们就能设置图片和按钮的位置,从而实现 图片在上文字在下、图片在下文字在上、图片在左文字在右和图片在右文字在左的样式。

默认情况下图片是在左边,文字在右边的。

originalStatus.png

接下来这段非常重要

图片的上、下、左约束是相对于UIButton的,而右是相对于文字的:

ImageEdge.png

文字的上、下、右约束是相对于UIButton的,而左是相对于图片的:

titleEdge.png

开搞

首先我们先确定几个参数:

图片在上,文字在下

设置垂直方向的排列时我们还需要获取一个参数,就是按钮和文字、图片垂直空间上上下两边的空隙。

ZZRBUTTONTYPE_IMAGE_TOP.png

这个空隙的大小就是按钮的高度减去图片和文字以及中间空隙的高度除2获得的。

CGFloat verticalSpace = (buttonSize.height - titleSize.height - imageSize.height - buttonSpace)/2.0;

接下来就是设置图片和文字的边界了

图片边界:

这样一来,图片的边界就设置好了。

文字边界:

这样设置了之后,文字和图片的位置就设置好了。

            //上下空余的间隙
            CGFloat verticalSpace = (buttonSize.height - titleSize.height - imageSize.height - buttonSpace)/2.0;
            
            [self setImageEdgeInsets:UIEdgeInsetsMake(verticalSpace,
                                                      (buttonSize.width-imageSize.width)/2.0,
                                                      verticalSpace + titleSize.height + buttonSpace,
                                                      (buttonSize.width-imageSize.width)/2.0-titleSize.width)];
            
            [self setTitleEdgeInsets:UIEdgeInsetsMake(verticalSpace + imageSize.height + buttonSpace,
                                                      (buttonSize.width - titleSize.width)/2.0 - imageSize.width,
                                                      verticalSpace,
                                                      (buttonSize.width - titleSize.width)/2.0)];
UIButtonTop.png UIButtonTop_showLine.png

图片在左,文字在右

这个情况是系统默认的情况,所以我们基本不需要做处理,只需要把图片右侧相对于文字的空隙和文字左侧相对于图片的空隙都设置为我们设置的空隙就可以了。

            [self setImageEdgeInsets:UIEdgeInsetsMake(0,
                                                      0,
                                                      0,
                                                      buttonSpace)];
            
            [self setTitleEdgeInsets:UIEdgeInsetsMake(0,
                                                      buttonSpace,
                                                      0,
                                                      0)];
UIButtonLeft.png UIButtonLeft_showLine.png

图片在右,文字在左

这个情况和上边的情况类似,只不过文字和图片调换了位置,所以我们把他们互相约束的大小改成负的(图片宽度+文字宽度+空隙)就可以了。

            [self setImageEdgeInsets:UIEdgeInsetsMake(0,
                                                      0,
                                                      0,
                                                      -(imageSize.width + titleSize.width + buttonSpace))];
            
            [self setTitleEdgeInsets:UIEdgeInsetsMake(0,
                                                      -(imageSize.width + titleSize.width + buttonSpace),
                                                      0,
                                                      0)];
UIButtonRight.png UIButtonRight_showLine.png

图片在下,文字在上

这个情况和第一种情况(图片在上,文字在下)类似,只不过是文字和图片在垂直方向上调换了一下位置,左右的约束都没有改变,所以也就不详细说了,理解了第一种情况应该就很好理解这中情况。

            CGFloat verticalSpace = (buttonSize.height - titleSize.height - imageSize.height - buttonSpace)/2.0;
            
            [self setImageEdgeInsets:UIEdgeInsetsMake(verticalSpace + titleSize.height + buttonSpace,
                                                      (buttonSize.width-imageSize.width)/2.0,
                                                      verticalSpace,
                                                      (buttonSize.width-imageSize.width)/2.0-titleSize.width)];

            [self setTitleEdgeInsets:UIEdgeInsetsMake(verticalSpace,
                                                      (buttonSize.width - titleSize.width)/2.0 - imageSize.width,
                                                      verticalSpace + imageSize.height + buttonSpace,
                                                      (buttonSize.width - titleSize.width)/2.0)];
UIButtonBottom.png UIButtonBottom_showLine.png

结束

其实这个边界的东西很好理解,只要想通了一个,其他方向的就很好控制了。
以上的内容都是我自己研究出来的结果,如果有哪些地方不对,还希望有大神能够批评指正。
那今天就这样了~

啊对了!Demo地址在这里

上一篇 下一篇

猜你喜欢

热点阅读