button图文

Button是我们平时用的最多的控件之一,经常会遇到图片文字位置的问题,用下面的方法一行代码就可以搞定

创建UIButton分类

.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSUInteger, DCDButtonEdgeInsetsStyle) {
DCDButtonEdgeInsetsStyleTop, // image在上,label在下
DCDButtonEdgeInsetsStyleLeft, // image在左,label在右
DCDButtonEdgeInsetsStyleBottom, // image在下,label在上
DCDButtonEdgeInsetsStyleRight // image在右,label在左
};
@interface UIButton (TitleImageSpacing)
/**
* 设置button的titleLabel和imageView的布局样式,及间距
*
* @param style titleLabel和imageView的布局样式
* @param space titleLabel和imageView的间距
*/
- (void)layoutButtonWithEdgeInsetsStyle:(DCDButtonEdgeInsetsStyle)style
imageTitleSpace:(CGFloat)space;
@end

.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#import "UIButton+TitleImageSpacing.h"
@implementation UIButton (TitleImageSpacing)
- (void)layoutButtonWithEdgeInsetsStyle:(DCDButtonEdgeInsetsStyle)style
imageTitleSpace:(CGFloat)space
{
// self.backgroundColor = [UIColor cyanColor];
/**
* 前置知识点:titleEdgeInsets是title相对于其上下左右的inset,跟tableView的contentInset是类似的,
* 如果只有title,那它上下左右都是相对于button的,image也是一样;
* 如果同时有image和label,那这时候image的上左下是相对于button,右边是相对于label的;title的上右下是相对于button,左边是相对于image的。
*/
// 1. 得到imageView和titleLabel的宽、高
CGFloat imageWith = self.imageView.frame.size.width;
CGFloat imageHeight = self.imageView.frame.size.height;
CGFloat labelWidth = 0.0;
CGFloat labelHeight = 0.0;
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// 由于iOS8中titleLabel的size为0,用下面的这种设置
labelWidth = self.titleLabel.intrinsicContentSize.width;
labelHeight = self.titleLabel.intrinsicContentSize.height;
} else {
labelWidth = self.titleLabel.frame.size.width;
labelHeight = self.titleLabel.frame.size.height;
}
// 2. 声明全局的imageEdgeInsets和labelEdgeInsets
UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
// 3. 根据style和space得到imageEdgeInsets和labelEdgeInsets的值
switch (style) {
case DCDButtonEdgeInsetsStyleTop:
{
imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
}
break;
case DCDButtonEdgeInsetsStyleLeft:
{
imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
}
break;
case DCDButtonEdgeInsetsStyleBottom:
{
imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
}
break;
case DCDButtonEdgeInsetsStyleRight:
{
imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);
}
break;
default:
break;
}
// 4. 赋值
self.titleEdgeInsets = labelEdgeInsets;
self.imageEdgeInsets = imageEdgeInsets;
}

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int i = 1; i < 5; i ++) {
UIButton *goBtn = [[UIButton alloc] initWithFrame:CGRectMake(100, 150 * i , 200, 100)];
goBtn.backgroundColor = [UIColor redColor];
[goBtn setTitle:@"👆微信好友👆" forState:UIControlStateNormal];
[goBtn setImage:[UIImage imageNamed:@"img_wechat"] forState:UIControlStateNormal];
if (i == 1) {
[goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleTop imageTitleSpace:10];
}else if (i == 2){
[goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleLeft imageTitleSpace:10];
}else if (i == 3){
[goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleBottom imageTitleSpace:10];
}else if (i == 4){
[goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleRight imageTitleSpace:10];
}
[self.view addSubview:goBtn];
}

效果图

button