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的高度来的话,你会发现你的控件相距很大,使得文本显示异常。
如下图所示
解决方案:
_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));
修改之后的效果图如下所示 (显示正常)
如果你想适配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
}
本文作为初学者的学习的记录,以便之后查阅。谢谢。
谢谢您的阅读,希望本站及文档能带给你帮助,给你带来简洁明了的阅读体验。谢谢。
转载请保留以下链接。