UIFont
属性介绍
familyName
:字体家族的名字
fontName
:字体的名字
pointSize
:字号大小
ascender
:基准线以上的高度
descender
:基准线以下的高度(负数)
capHeight
:大写字母的高度
xHeight
:小写x的高度
lineHeight
:行高
leading
:行间距(一般为0)
NSString *text = @"字体高度😵";
UIFont *font = [UIFont fontWithName:@"Didot Italic" size:18];
NSLog(@"字体信息:\npointSize:%lf,\nascender:%lf,\ndescender:%lf,\ncapHeight:%lf,\nxHeight:%lf,\nlineHeight:%lf,\nleading:%lf",font.pointSize,font.ascender,font.descender,font.capHeight,font.xHeight,font.lineHeight,font.leading);
字体信息:
pointSize:18.000000,
ascender:16.956000,
descender:-5.220000,
capHeight:12.942000,
xHeight:7.956000,
lineHeight:22.176000,
leading:0.450000
1.设置的字体大小就是 pointSize
。
-
lineHeight
=ascender + descender
(按照图上所示应该为lineHeight
=ascender + descender +leading
,但是实际查看了几个字体,都是lineHeight
=ascender + descender
)。
3.实际行与行之间就是存在间隙的,间隙大小即为 lineHeight - pointSize
,在富文本中设置行高的时候,其实际文字间的距离就是加上这个距离的。(原来一直错误的理解文字间的距离就是行间距)。
行数计算(猜想)
text
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIFont *font = [UIFont fontWithName:@"Didot Italic" size:18];
NSLog(@"字体信息:\npointSize:%lf,\nascender:%lf,\ndescender:%lf,\ncapHeight:%lf,\nxHeight:%lf,\nlineHeight:%lf,\nleading:%lf",font.pointSize,font.ascender,font.descender,font.capHeight,font.xHeight,font.lineHeight,font.leading);
NSString *text = @"字体高度😵";
CGSize size= [text boundingRectWithSize:CGSizeMake(300, CGFLOAT_MAX)
options:NSStringDrawingTruncatesLastVisibleLine
attributes:@{NSFontAttributeName:font}
context:nil].size;
NSLog(@"文本计算:%lf,%lf",size.width,size.height);
UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(30, 0, size.width, size.height);
label.backgroundColor = [UIColor redColor];
label.numberOfLines = 0;
label.text = text;
label.font = font;
[self.view addSubview:label];
NSLog(@"label展示:%lf,%lf",label.frame.size.width,label.frame.size.height);
UILabel *label1 = [[UILabel alloc] init];
label1.frame = CGRectMake(30, 100, 300, 300);
label1.backgroundColor = [UIColor redColor];
label1.numberOfLines = 0;
label1.text = text;
label1.font = font;
[label1 sizeToFit];
[self.view addSubview:label1];
NSLog(@"label1展示:%lf,%lf",label1.frame.size.width,label1.frame.size.height);
self.label2 = [[UILabel alloc] init];
self.label2.backgroundColor = [UIColor redColor];
self.label2.numberOfLines = 0;
self.label2.text = text;
self.label2.font = font;
[self.view addSubview:self.label2];
[self.label2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(30);
make.top.mas_equalTo(200);
}];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSLog(@"label2展示:%lf,%lf",self.label2.frame.size.width,self.label2.frame.size.height);
}
字体信息:
pointSize:18.000000,
ascender:16.956000,
descender:-5.220000,
capHeight:12.942000,
xHeight:7.956000,
lineHeight:22.176000,
leading:0.450000
//iOS16.4 iPhone14
/**字体高度😵
*/
文本计算:94.000000,22.176000
label展示:94.000000,22.176000
label1展示:94.000000,22.333333
label2展示:94.000000,22.333333
/**字体高度😵\n字体高度😵
*/
文本计算:94.000000,44.352000
label展示:94.000000,44.352000
label1展示:94.000000,44.666667
label2展示:94.000000,44.666667
/**字体高度3😵\n字体高度3😵\n字体高度3😵
*/
文本计算:102.676000,66.528000
label展示:102.676000,66.528000
label1展示:103.000000,66.666667
label2展示:103.000000,66.666667
通过boundingRectWithSize...
方法获取的文本高度为字体的lineHeight*行数
。是否可以通过高度计算除以字体的lineHeight
判断是单行还是双行???
富文本
UIFont *font = [UIFont fontWithName:@"Didot Italic" size:18];
NSLog(@"字体信息:\npointSize:%lf,\nascender:%lf,\ndescender:%lf,\ncapHeight:%lf,\nxHeight:%lf,\nlineHeight:%lf,\nleading:%lf",font.pointSize,font.ascender,font.descender,font.capHeight,font.xHeight,font.lineHeight,font.leading);
NSString *text = @"字体高度😵";
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc]init];
style.lineBreakMode = NSLineBreakByWordWrapping;
style.alignment = NSTextAlignmentRight;
NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
[attributes setObject:style forKey:NSParagraphStyleAttributeName];
[attributes setObject:@(-3) forKey:NSBaselineOffsetAttributeName];
[attributes setObject:font forKey:NSFontAttributeName];
NSAttributedString *att = [[NSAttributedString alloc] initWithString:text attributes:attributes];
CGSize size = [att boundingRectWithSize:CGSizeMake(300, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
字体信息:
pointSize:18.000000,
ascender:16.956000,
descender:-5.220000,
capHeight:12.942000,
xHeight:7.956000,
lineHeight:22.176000,
leading:0.450000
//iOS16.4 iPhone14
/**字体高度😵
*/
文本计算:94.000000,25.176000
label展示:94.000000,25.176000
label1展示:94.000000,25.333333
label2展示:94.000000,25.333333
/**字体高度😵\nwww
*/
文本计算:94.000000,50.352000
label展示:94.000000,50.352000
label1展示:94.000000,50.666667
label2展示:94.000000,50.666667
/**字体高度😵\nwww\n123
*/
文本计算:94.000000,75.528000
label展示:94.000000,75.528000
label1展示:94.000000,75.666667
label2展示:94.000000,75.666667
富文本部分属性设置会影响当行字体的高度,但应该也可以通过高度计算除以单行高度判断文本行数,如该实例中单行高度为lineHeight+NSBaselineOffsetAttributeName
。
注意:sizeToFit
和Masonry
会根据屏幕分辨率向上适配宽高。
参考文档
iOS_UIFont的Attributes解析
iOS 对UIFont的新的理解
UILabel行间距lineSpacing 行高lineHeight