iOS 9.0系统下字体宽度的计算处理

作者: 王隆帅 | 来源:发表于2016-04-19 09:59 被阅读2956次

    一、前言

    在做项目的时候有计算label的宽度适配UI的要求,之前也总结了Category是计算label自适应高度及宽度,然后发现在9系统下总是出现'...'就是显示不全,所以在此记录一下解决方法希望能帮助有同样需求的人。

    二、之前的Category方法

    #pragma mark - 计算字符串尺寸
    /**
     *  计算字符串高度 (多行)
     *
     *  @param width 字符串的宽度
     *  @param font  字体大小
     *
     *  @return 字符串的尺寸
     */
    - (CGSize)heightWithWidth:(CGFloat)width andFont:(CGFloat)font {
        NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:font]};
        CGSize  size = [self boundingRectWithSize:CGSizeMake(width, MAXFLOAT)  options:(NSStringDrawingUsesFontLeading|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin)  attributes:attribute context:nil].size;
        return size;
    }
    
    /**
     *  计算字符串宽度
     *
     *  @param height 字符串的高度
     *  @param font  字体大小
     *
     *  @return 字符串的尺寸
     */
    - (CGSize)widthWithHeight:(CGFloat)height andFont:(CGFloat)font {
        NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:font]};
        CGSize  size = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, height)  options:(NSStringDrawingUsesFontLeading|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin)   attributes:attribute context:nil].size;
        return size;
    }
    

    三、原因

    iOS9的字体大小与之前的版本字体大小不一样。

    起码, 在systemFont下是这样。

    举例说,字符串在 label上显示,label的 font = [UIFont systemFontOfSize:13]
    在iOS 8下,需要占用的宽度为40.f,但在iOS9下,就可能需要45.f.

    四、解决方法

    在label初始化的时候添加如下函数:

    adjustsFontSizeToFitWidth
    
    

    举例如下:

    - (UILabel *)priceLabel {
    
        if (!_priceLabel) {
            
            _priceLabel = [[UILabel alloc] init];
            _priceLabel.font = H16;
            _priceLabel.textColor = UIColorFromRGB(0xE71414);
            _priceLabel.textAlignment = NSTextAlignmentRight;
            [_priceLabel adjustsFontSizeToFitWidth];
        }
        
        return _priceLabel;
    }
    
    

    在布局的时候不用考虑宽度,如下:

    [self.priceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.right.equalTo(-10);
            make.centerY.equalTo(weakSelf.nameLabel);
            make.height.equalTo(21);
    }];
    
    

    五、完事

    相关文章

      网友评论

      • StarkShen: _priceLabel.font = H16;
        是通过换字体解决的吗?

      • VictoryForYou:字体30以上在真机都一样大小了 你能设置45?
        王隆帅:@VictoryForYou 什么意思?

      本文标题:iOS 9.0系统下字体宽度的计算处理

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