美文网首页iOS开发-UILabelios-UI
关于boundingRectWithSize计算label宽高的

关于boundingRectWithSize计算label宽高的

作者: liwuJs | 来源:发表于2016-11-17 16:22 被阅读3177次

    在UITableView中,可能每一行的cell显示的内容都不一样,在宽度固定的情况,就需要根据要显示的文字来计算实际需要的高度。

    这时就需要用到系统函数- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);

    这个方法是iOS7.0以后的新API,在之前使用的是- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:") __TVOS_PROHIBITED;

    在使用这个函数去计算的时候返回的高度会出现不准确的现象。后来发现是因为- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);没有设置lineBreakMode导致,写下来备忘。

    代码如下:

    _showLabel.text = str;

    _showLabel.lineBreakMode=NSLineBreakByWordWrapping;//计算结果不准确是因为没有设置这一行

    //看到评论后,才发现计算结果不准确不是因为这个原因,是因为计算时使用的字体大小和实际lb使用的大小不一致造成的,感谢网友的指正。原本写下这些只是为了做个备忘记录,没成想给大家造成了误导,在此说声抱歉。

    _showLabel.font = [UIFont systemFontOfSize:16.0];//新加一行

    CGSize size = CGSizeMake(_showLabel.frame.size.width, 5000);

    NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:16.0]};

    CGSize retSize = [_showLabel.text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil].size;

    相关文章

      网友评论

      • 渡边君WM:_showLabel.lineBreakMode=NSLineBreakByWordWrapping;你写上这句话并不能解决高度获取不正确的问题,这个只是把显示不全的内容剪掉了而已!点进去,自己看属性。
        liwuJs:谢谢老铁的指正,经过查证,是因为计算label采用的字体大小和label实际使用的大小不一致造成,与lineBreakMode设置无关。
      • zhuFUn:谢谢老铁,解决了问题
      • 流刃若火泣:老铁,6:+1:

      本文标题:关于boundingRectWithSize计算label宽高的

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