IOS BUG记录 boundingRectWithSize计算内容宽度高度的问题

IOS BUG记录 boundingRectWithSize计算内容宽度高度的问题

在IOS6和IOS7不同的系统出现的计算文本高度的方法不一样
IOS6中我们使用以下两个方法计算文本高度

  • (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size NS_DEPRECATED_IOS(2_0, 7_0, “Use -boundingRectWithSize:options:attributes:context:”) __TVOS_PROHIBITED; // Uses NSLineBreakModeWordWrap
  • (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, “Use -boundingRectWithSize:options:attributes:context:”) __TVOS_PROHIBITED; // NSTextAlignment is not needed to determine size

iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法

  • (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary

IOS6上sizeWithFont使用方式:

[@“欢迎来访” sizeWithFont:font constrainedToSize:maxSize lineBreakMode:NSLineBreakByTruncatingTail];

IOS7上boundingRectWithSize使用方式


NSDictionary *attribute = @{NSFontAttributeName:font};
CGSize textSize = [@“欢迎来访” boundingRectWithSize:maxSize options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading attributes:attribute context:nil].size;

当然本文记录在使用boundingRectWithSize出现的问题

问题现象:

当存在很多空格时候,出现计算的文本超出所限制的maxSize,使得文本显示异常。
UIlabel的text中有很多空字符,甚至占据了一行,所以开发时设计下一个控件的frame的时候,如果是基于text的高度来的话,你会发现你的控件相距很大,使得文本显示异常。

如下图所示

alt text

解决方案:


_messageContent = messageContent ? messageContent : @"";
    _messageContent = [_messageContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和换行字符
    _messageContent = [_messageContent stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    _messageContent = [_messageContent stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    [self.messageLabel setText:_messageContent];

或者使用,下面经过测试的代码


NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
        paragraphStyle.alignment = NSTextAlignmentLeft;

        NSDictionary *attribute = @{NSFontAttributeName : font,
                                      NSParagraphStyleAttributeName : paragraphStyle};

        CGSize textSize = [self boundingRectWithSize:maxSize options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading attributes:attribute context:nil].size;

        return CGSizeMake(ceil(textSize.width), ceil(textSize.height));

修改之后的效果图如下所示 (显示正常)

alt text

如果你想适配iOS7以及更低的版本版本兼容,可以尝试如下带代码:

CGSize size;

if ([tempPointStr respondsToSelector:
     @selector(boundingRectWithSize:options:attributes:context:)])
{
  NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
  paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
  paragraphStyle.alignment = NSTextAlignmentLeft;

  NSDictionary * attributes = @{NSFontAttributeName : self.lblHidden.font,
                      NSParagraphStyleAttributeName : paragraphStyle};

  size = [tempPointStr boundingRectWithSize:self.lblHidden.frame.size
                                    options:NSStringDrawingUsesFontLeading
                                           |NSStringDrawingUsesLineFragmentOrigin
                                 attributes:attributes
                                    context:nil].size;
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  size = [tempPointStr sizeWithFont:self.lblHidden.font
                  constrainedToSize:self.lblHidden.frame.size
                      lineBreakMode:NSLineBreakByWordWrapping];
#pragma clang diagnostic pop
}

本文作为初学者的学习的记录,以便之后查阅。谢谢。

谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。

转载请保留以下链接。

本文地址:http://www.laileshuo.com/?p=733

博客地址:www.laileshuo.com www.laileshuo.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值