replace为不推荐-sizeWithFont:constrainedToSize:lineBreakMode:在iOS 7中?

在iOS 7中,方法是:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode 

和方法:

 - (CGSize)sizeWithFont:(UIFont *)font 

已被弃用。 我该如何更换

 CGSize size = [string sizeWithFont:font constrainedToSize:constrainSize lineBreakMode:NSLineBreakByWordWrapping]; 

和:

 CGSize size = [string sizeWithFont:font]; 

你可以试试这个:

 CGRect textRect = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:FONT} context:nil]; CGSize size = textRect.size; 

只需将“FONT”改为“[UIFont font ….]”

由于我们无法使用sizeWithAttributes的所有iOS大于4.3,我们必须编写条件代码为7.0和以前的iOS。

1)解决scheme1:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { CGSize size = CGSizeMake(230,9999); CGRect textRect = [specialityObj.name boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14]} context:nil]; total_height = total_height + textRect.size.height; } else { CGSize maximumLabelSize = CGSizeMake(230,9999); expectedLabelSize = [specialityObj.name sizeWithFont:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; //iOS 6 and previous. total_height = total_height + expectedLabelSize.height; } 

2)解决scheme2

 UILabel *gettingSizeLabel = [[UILabel alloc] init]; gettingSizeLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // Your Font-style whatever you want to use. gettingSizeLabel.text = @"YOUR TEXT HERE"; gettingSizeLabel.numberOfLines = 0; CGSize maximumLabelSize = CGSizeMake(310, 9999); // this width will be as per your requirement CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize]; 

第一种解决scheme有时无法返回适当的高度值。 所以用另一种解决scheme 这将完美的工作。

第二个选项非常好,在没有条件代码的所有iOS中都能够顺利运行。

这是简单的解决scheme:

要求 :

 CGSize maximumSize = CGSizeMake(widthHere, MAXFLOAT); UIFont *font = [UIFont systemFontOfSize:sizeHere]; 

现在作为constrainedToSizeusage:lineBreakMode:iOS 7.0中不推荐使用:

 CGSize expectedSize = [stringHere sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping]; 

现在在更高版本的iOS 7.0中使用将是:

 // Let's make an NSAttributedString first NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:stringHere]; //Add LineBreakMode NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping]; [attributedString setAttributes:@{NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, attributedString.length)]; // Add Font [attributedString setAttributes:@{NSFontAttributeName:font} range:NSMakeRange(0, attributedString.length)]; //Now let's make the Bounding Rect CGSize expectedSize = [attributedString boundingRectWithSize:maximumSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size; 

在大多数情况下,我使用的方法sizeWithFont:constrainedToSize:lineBreakMode:估计UILabel容纳其文本的最小尺寸(特别是当标签必须放置在一个UITableViewCell内)…

…如果这正是你的情况,你可以简单地使用这个方法:

 CGSize size = [myLabel textRectForBounds:myLabel.frame limitedToNumberOfLines:mylabel.numberOfLines].size; 

希望这可能有帮助。

下面是两个简单的方法,将取代这两个弃用的方法。

这里是相关的参考文献:

如果使用NSLineBreakByWordWrapping,则不需要指定NSParagraphStyle,因为这是默认值: https : //developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index。 HTML#// apple_ref / OCC / CLM / NSParagraphStyle / defaultParagraphStyle

您必须获得大小的细胞,以匹配已弃用的方法结果。 https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context

 + (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font { CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}]; return CGSizeMake(ceilf(size.width), ceilf(size.height)); } + (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{ CGRect textRect = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:nil]; return CGSizeMake(ceilf(textRect.size.width), ceilf(textRect.size.height)); } 
 UIFont *font = [UIFont boldSystemFontOfSize:16]; CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil]; CGSize stringSize= new.size; 

[接受的答案在一个类别中很好地工作。 我正在覆盖弃用的方法名称。 这是一个好主意吗? 似乎在Xcode 6.x没有投诉的工作]

如果您的部署目标是7.0或更高,这将起作用。 类别是NSString (Util)

的NSString + Util.h

 - (CGSize)sizeWithFont:(UIFont *) font; - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size; 

的NSString + Util.m

 - (CGSize)sizeWithFont:(UIFont *) font { NSDictionary *fontAsAttributes = @{NSFontAttributeName:font}; return [self sizeWithAttributes:fontAsAttributes]; } - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size { NSDictionary *fontAsAttributes = @{NSFontAttributeName:font}; CGRect retVal = [self boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:fontAsAttributes context:nil]; return retVal.size; } 
 UIFont *font = [UIFont fontWithName:@"Courier" size:16.0f]; NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; paragraphStyle.alignment = NSTextAlignmentRight; NSDictionary *attributes = @{ NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle }; CGRect textRect = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil]; CGSize size = textRect.size; 

从两个答案1 + 2