iOS Button内的图片和文字的自由排列

转自:https://github.com/Phelthas/Demo_ButtonImageTitleEdgeInsets

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(NSInteger, LXMImagePosition) {
LXMImagePositionLeft = 0, //图片在左,文字在右,默认
LXMImagePositionRight = 1, //图片在右,文字在左
LXMImagePositionTop = 2, //图片在上,文字在下
LXMImagePositionBottom = 3, //图片在下,文字在上
};

@interface UIButton (LXMImagePosition)

/**
* 利用UIButton的titleEdgeInsets和imageEdgeInsets来实现文字和图片的自由排列
* 注意:这个方法需要在设置图片和文字之后才可以调用,且button的大小要大于 图片大小+文字大小+spacing
*
* @param spacing 图片和文字的间隔
*/
- (void)setImagePosition:(LXMImagePosition)postion spacing:(CGFloat)spacing;

@end
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
@implementation UIButton (LXMImagePosition)

- (void)setImagePosition:(LXMImagePosition)postion spacing:(CGFloat)spacing {
CGFloat imageWith = self.imageView.image.size.width;
CGFloat imageHeight = self.imageView.image.size.height;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// CGFloat labelWidth = [self.titleLabel.text sizeWithFont:self.titleLabel.font].width;
// CGFloat labelHeight = [self.titleLabel.text sizeWithFont:self.titleLabel.font].height;
#pragma clang diagnostic pop

// gzd 修改 16.9.28
CGSize labelSize = CGSizeZero;
CGFloat labelWidth = 0;
CGFloat labelHeight = 0;
if ([self.titleLabel.text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
labelSize = [self.titleLabel.text boundingRectWithSize:self.bounds.size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:self.titleLabel.font} context:nil].size;
}else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
labelSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font];
#pragma clang diagnostic pop
}
labelWidth = labelSize.width;
labelHeight = labelSize.height;
//----------------

CGFloat imageOffsetX = (imageWith + labelWidth) / 2 - imageWith / 2;//image中心移动的x距离
CGFloat imageOffsetY = imageHeight / 2 + spacing / 2;//image中心移动的y距离
CGFloat labelOffsetX = (imageWith + labelWidth / 2) - (imageWith + labelWidth) / 2;//label中心移动的x距离
CGFloat labelOffsetY = labelHeight / 2 + spacing / 2;//label中心移动的y距离

switch (postion) {
case LXMImagePositionLeft:
self.imageEdgeInsets = UIEdgeInsetsMake(0, -spacing/2, 0, spacing/2);
self.titleEdgeInsets = UIEdgeInsetsMake(0, spacing/2, 0, -spacing/2);
break;

case LXMImagePositionRight:
self.imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth + spacing/2, 0, -(labelWidth + spacing/2));
self.titleEdgeInsets = UIEdgeInsetsMake(0, -(imageHeight + spacing/2), 0, imageHeight + spacing/2);
break;

case LXMImagePositionTop:
self.imageEdgeInsets = UIEdgeInsetsMake(-imageOffsetY, imageOffsetX, imageOffsetY, -imageOffsetX);
self.titleEdgeInsets = UIEdgeInsetsMake(labelOffsetY, -labelOffsetX, -labelOffsetY, labelOffsetX);
break;

case LXMImagePositionBottom:
self.imageEdgeInsets = UIEdgeInsetsMake(imageOffsetY, imageOffsetX, -imageOffsetY, -imageOffsetX);
self.titleEdgeInsets = UIEdgeInsetsMake(-labelOffsetY, -labelOffsetX, labelOffsetY, labelOffsetX);
break;

default:
break;
}
}

@end

iOS Button内的图片和文字的自由排列
http://example.com/2017/11/30/iOS-Button内的图片和文字的自由排列/
作者
guanzhendong
发布于
2017年11月30日
许可协议