NSAttributedString 属性文本(图文混排)
NSMutableAttributedString 的使用
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
@interface ViewController ()
@property (nonatomic, strong) UILabel *textLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.textLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 200, 80)];
self.textLabel.backgroundColor = [UIColor grayColor];
self.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.textLabel.font = [UIFont systemFontOfSize:15];
self.textLabel.numberOfLines = 0;
[self.view addSubview:self.textLabel];
NSString *text = @"就😢发就发就发就发aaaaaaa就就发就就发就发就发就发了是就发就发就发就发aaaaaaa就就发就就发就发就发就发了是就发就发就发就发aaaaaaa就就发就就发就发就发就发了是\n看到就😢😢😢发了就发就发就发就发就发aaaaaaa就就发就就发就发就发就发了是就发就发就发aaaaaaa就就发就就发就发就发就发了是上课点击发😢😢😢😢😢😢";
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 2.5;
paragraphStyle.paragraphSpacing = 7.5;
// 段落首行缩进
paragraphStyle.firstLineHeadIndent = 30;//26.5;
// paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
// paragraphStyle.maximumLineHeight = 20; // 文本最大行距
// paragraphStyle.minimumLineHeight = 20;
// paragraphStyle.alignment = NSTextAlignmentJustified;
// paragraphStyle.paragraphSpacingBefore = 20;
// 这个字典里要一定包含字体大小,其他的看具体需求
UIFont *font = [UIFont systemFontOfSize:15];
NSDictionary *dic = @{
NSFontAttributeName : font,
NSParagraphStyleAttributeName : paragraphStyle
};
NSDictionary *dic2 = @{
NSForegroundColorAttributeName : [UIColor redColor],
NSFontAttributeName : [UIFont systemFontOfSize:50]
};
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:text attributes:dic];
// [attString addAttributes:dic2 range:NSMakeRange(2, 3)];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [UIImage imageNamed:@"test"];
// 设置 y 值是为了让图片和文字对齐
attachment.bounds = CGRectMake(0, -3, font.lineHeight, font.lineHeight);
NSAttributedString *textTttachment = [NSAttributedString attributedStringWithAttachment:attachment];
[attString insertAttributedString:textTttachment atIndex:1];
[attString appendAttributedString:textTttachment];
// options 一般都写:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin
// 官方文档说要用 ceil 方法搞一下。
CGSize size = [attString boundingRectWithSize:CGSizeMake(200, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin context:nil].size;
double height = ceil(size.height);
if (size.height > 1) {
}
self.textLabel.frame = CGRectMake(50, 100, 200, height);
self.textLabel.attributedText = attString;
// 给 UILabel 设置 attributedText 后,超出的文字不显示省略号,可能是设置以后 UILabel
// 原本的设置会被覆盖(包括字体,字体颜色等属性),如果要显示省略号,得重新设置一下
self.textLabel.lineBreakMode = NSLineBreakByTruncatingTail;
}
本文由作者按照 CC BY 4.0 进行授权