美文网首页
iOS UIFont简介与文本行数判断

iOS UIFont简介与文本行数判断

作者: FieryDragon | 来源:发表于2023-07-22 13:14 被阅读0次

    UIFont

    UIFont.png
    属性介绍

    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

    1. 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

    注意:sizeToFitMasonry会根据屏幕分辨率向上适配宽高

    参考文档

    iOS_UIFont的Attributes解析
    iOS 对UIFont的新的理解
    UILabel行间距lineSpacing 行高lineHeight

    相关文章

      网友评论

          本文标题:iOS UIFont简介与文本行数判断

          本文链接:https://www.haomeiwen.com/subject/ajbtpdtx.html