前言
本文主要给大家介绍了关于ios label全方位对齐的实现方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
aruilabeltextalign
1. 实现 uilabel文本在 左(上 中 下)、中(上 中 下)、右(上 中 下) 9个方位显示;
2. 提供富文本底部不对齐的解决方案;
演示
核心代码:
aralignlabel.h
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
|
#import <uikit/uikit.h> @ class armaker; typedef ns_enum(nsuinteger, textaligntype) { textaligntype_top = 10, // 顶部对齐 textaligntype_left, // 左边对齐 textaligntype_bottom, // 底部对齐 textaligntype_right, // 右边对齐 textaligntype_center // 水平/垂直对齐(默认中心对齐) }; @interface aralignlabel : uilabel /** * 根据对齐方式进行文本对齐 * * @param aligntype 对齐block */ - ( void )textalign:( void (^)(armaker *make))aligntype; @end //工具类 @interface armaker : nsobject /* 存放对齐样式 */ @property(nonatomic, strong) nsmutablearray *typearray; /** * 添加对齐样式 */ - (armaker *(^)(textaligntype type))addaligntype; @end |
aralignlabel.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#import "aralignlabel.h" @interface aralignlabel () /* 对齐方式 */ @property(nonatomic, strong) nsarray *typearray; //上 @property(nonatomic, assign) bool hastop; //左 @property(nonatomic, assign) bool hasleft; //下 @property(nonatomic, assign) bool hasbottom; //右 @property(nonatomic, assign) bool hasright; @end @implementation aralignlabel - (cgrect)textrectforbounds:(cgrect)bounds limitedtonumberoflines:(nsinteger)numberoflines { cgrect textrect = [super textrectforbounds:bounds limitedtonumberoflines:numberoflines]; if (self.typearray){ for ( int i=0; i<self.typearray.count; i++) { textaligntype type = [self.typearray[i] integervalue]; switch (type) { case textaligntype_top: //顶部对齐 self.hastop = yes; textrect.origin.y = bounds.origin.y; break ; case textaligntype_left: //左部对齐 self.hasleft = yes; textrect.origin.x = bounds.origin.x; break ; case textaligntype_bottom: //底部对齐 self.hasbottom = yes; textrect.origin.y = bounds.size.height - textrect.size.height; break ; case textaligntype_right: //右部对齐 self.hasright = yes; textrect.origin.x = bounds.size.width - textrect.size.width; break ; case textaligntype_center: if (self.hastop) { //上中 textrect.origin.x = (bounds.size.width - textrect.size.width)*0.5; } else if (self.hasleft) { //左中 textrect.origin.y = (bounds.size.height - textrect.size.height)*0.5; } else if (self.hasbottom) { //下中 textrect.origin.x = (bounds.size.width - textrect.size.width)*0.5; } else if (self.hasright) { //右中 textrect.origin.y = (bounds.size.height - textrect.size.height)*0.5; } else { //上下左右居中 textrect.origin.x = (bounds.size.width - textrect.size.width)*0.5; textrect.origin.y = (bounds.size.height - textrect.size.height)*0.5; } break ; default : break ; } } } return textrect; } - ( void )drawtextinrect:(cgrect)requestedrect { cgrect actualrect = requestedrect; if (self.typearray) { actualrect = [self textrectforbounds:requestedrect limitedtonumberoflines:self.numberoflines]; } [super drawtextinrect:actualrect]; } - ( void )textalign:( void (^)(armaker *make))aligntype { armaker *make = [[armaker alloc]init]; aligntype(make); self.typearray = make.typearray; } @end //工具类 @implementation armaker - (instancetype)init { self = [super init]; if (self) { self.typearray = [nsmutablearray array]; } return self; } - (armaker *(^)( enum textaligntype type))addaligntype { __weak typeof (self) weakself = self; return ^( enum textaligntype type) { [weakself.typearray addobject:@(type)]; return weakself; }; } @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
60
61
62
63
64
65
66
67
|
- ( void )viewdidload { [super viewdidload]; self.view.backgroundcolor = [uicolor whitecolor]; if (_index == 9) { //富文本底部对齐 [self attributedtextagainofbottom]; } else { aralignlabel *label = [[aralignlabel alloc] initwithframe:cgrectmake(kscreenwidth/2.0 - 150, 300, 300, 80)]; label.backgroundcolor = [uicolor orangecolor]; label.textcolor = [uicolor blackcolor]; label.font = [uifont systemfontofsize:18]; label.text = @ "爱学习,爱编程,爱咖啡可乐" ; label.numberoflines = 1; [self.view addsubview:label]; switch (_index) { case 0: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_left).addaligntype(textaligntype_top); }]; break ; case 1: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_left).addaligntype(textaligntype_center); }]; break ; case 2: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_left).addaligntype(textaligntype_bottom); }]; break ; case 3: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_center).addaligntype(textaligntype_top); }]; break ; case 4: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_center); }]; break ; case 5: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_center).addaligntype(textaligntype_bottom); }]; break ; case 6: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_right).addaligntype(textaligntype_top); }]; break ; case 7: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_right).addaligntype(textaligntype_center); }]; break ; case 8: [label textalign:^(armaker *make) { make.addaligntype(textaligntype_right).addaligntype(textaligntype_bottom); }]; break ; default : break ; } } } |
富文本底部对齐
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
|
//富文本底部对齐 - ( void )attributedtextagainofbottom { cgfloat space = 10.0; aralignlabel *leftlb = [[aralignlabel alloc] initwithframe:cgrectmake(20, 200, kscreenwidth/2.0 - 20 - space/2.0, 80)]; leftlb.backgroundcolor = [uicolor lightgraycolor]; leftlb.textcolor = [uicolor blackcolor]; leftlb.numberoflines = 1; [self.view addsubview:leftlb]; //右下 [leftlb textalign:^(armaker *make) { make.addaligntype(textaligntype_center); }]; nsmutableattributedstring *attributedarr = [[nsmutableattributedstring alloc] initwithstring:@ "单价 $123" ]; [attributedarr setattributes:@{nsfontattributename:[uifont systemfontofsize:40], nsforegroundcolorattributename:[uicolor blackcolor]} range:nsmakerange(0, 1)]; [attributedarr setattributes:@{nsfontattributename:[uifont systemfontofsize:25], nsforegroundcolorattributename:[uicolor blackcolor]} range:nsmakerange(1, 1)]; [attributedarr setattributes:@{nsfontattributename:[uifont systemfontofsize:20], nsforegroundcolorattributename:[uicolor bluecolor]} range:nsmakerange(3, 1)]; [attributedarr setattributes:@{nsfontattributename:[uifont systemfontofsize:35], nsforegroundcolorattributename:[uicolor redcolor]} range:nsmakerange(4, attributedarr.length - 4)]; leftlb.attributedtext = attributedarr; //对齐之后 aralignlabel *rightlb = [[aralignlabel alloc] initwithframe:cgrectmake(kscreenwidth/2.0 + space/2.0, 200, leftlb.frame.size.width, 80)]; rightlb.backgroundcolor = [uicolor lightgraycolor]; rightlb.textcolor = [uicolor blackcolor]; rightlb.numberoflines = 1; [self.view addsubview:rightlb]; //左下 [rightlb textalign:^(armaker *make) { make.addaligntype(textaligntype_center); }]; //设置部分文字的偏移量 (0是让文字保持原来的位置, 负值是让文字下移,正值是让文字上移) [attributedarr addattribute:nsbaselineoffsetattributename value:@(1) range:nsmakerange(0, 1)]; [attributedarr addattribute:nsbaselineoffsetattributename value:@(0) range:nsmakerange(1, 1)]; [attributedarr addattribute:nsbaselineoffsetattributename value:@(-2) range:nsmakerange(3, 1)]; [attributedarr addattribute:nsbaselineoffsetattributename value:@(-3) range:nsmakerange(4, attributedarr.length - 4)]; rightlb.attributedtext = attributedarr; } |
富文本底部对齐 - 使用场景:
github:https://github.com/archll/aruilabeltextalign
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://www.jianshu.com/p/ab1eb2785ec0