美文网首页程序员iOS DeveloperiOS 知识点
boundingRectWithSize计算文字高度不准问题

boundingRectWithSize计算文字高度不准问题

作者: 宋唐不送糖 | 来源:发表于2017-02-15 18:08 被阅读6843次

    UILabel有两个计算文字大小的方法:

    1.针对对富文本计算NSAttributedString

    - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 6_0);

    2.针对与普通文本计算NSString

    - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);

    对于这两个方法有相同的参数
    参数一:size表示计算文本的最大宽高(就是限制的最大高度、宽度),一般情况下我们设置最大的宽度、高度不限制CGSizeMake(getScreenWidth(), CGFLOAT_MAX),注意:限制的宽度不同,计算的高度结果也不同。

    参数二: options表示计算的类型
    NSStringDrawingUsesLineFragmentOrigin:绘制文本时使用 *line fragement origin *而不是 baseline origin。一般使用这项。

    NSStringDrawingUsesFontLeading:根据字体计算高度

    NSStringDrawingUsesDeviceMetrics:使用象形文字计算高度

    NSStringDrawingTruncatesLastVisibleLine:如果NSStringDrawingUsesLineFragmentOrigin设置,这个选项没有用

    参数三:attributes 表示富文本的属性NSAttributedString.h比如字体、文字样式NSFontAttributeNameNSParagraphStyleAttributeName

    参数四:NSStringDrawingContext
    When stringDrawingContext=nil, it's equivalent of passing the default instance initialized with [[NSStringDrawingContext alloc] init] context
    上下文,包括一些信息,例如如何调整字间距以及缩放。该参数一般可为 nil 。


    问题:有时候计算文字的时候大小和实际的大小不一样?

    解决办法1:检测字体和限制的宽度是否设置正确(楼主载在这里/(ㄒoㄒ)/~~)

    解决办法2:可以设置NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
    注意:swift中要写这样的组合是不支持的,点击这里查看解决方法www.jianshu.com/p/545f7f1d8741

    解决办法3:当你是把获得的高度来布局控件的View的高度的时候,需要把获得size = [string boundingRectWithSize:CGSizeMake(getScreenWidth(), CGFLOAT_MAX) options:options context:nil].size转化为ceilf(size.height)

    解决办法4:由于这个方法计算字符串的大小的通过取得字符串的size来计算, 如果你计算的字符串中包含\n\r 这样的字符,也只会把它当成字符来计算。但是在显示的时候就是\n是转义字符,那么显示的计算的高度就不一样了,所以可以采用:计算的高度 = boundingRectWithSize计算出来的高度 + \n\r转义字符出现的个数 * 单行文本的高度。

    相关文章

      网友评论

      • Fancy_饭稀:老铁,感谢一下你,解决了我的问题,ceilf函数那个
      • LD_左岸:CGFloat textH = [titleLabel.text boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 20, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]} context:nil].size.height;
        CGFloat margin = 10;
        [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_offset(margin);
        make.top.mas_offset(margin);
        make.right.mas_offset(-margin);
        make.height.mas_equalTo(textH);
        }];

        这么写怎么搞都不准啊
        宋唐不送糖:抱歉许久不上简书回复晚了。因为约束会有冲突,检查下相对约束是否有限制高度
        LD_左岸:字体一样 宽度的话也确实是减去20了 看下面的约束也是减去20
      • 一苇杭:有时间可以试下看看

      本文标题:boundingRectWithSize计算文字高度不准问题

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