简体   繁体   English

在iOS 7中替换弃用的-sizeWithFont:constrainedToSize:lineBreakMode:

[英]Replacement for deprecated -sizeWithFont:constrainedToSize:lineBreakMode: in iOS 7?

In iOS 7, the method: 在iOS 7中,方法:

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

and the method: 和方法:

- (CGSize)sizeWithFont:(UIFont *)font

are deprecated. 不推荐使用。 How can I replace 我怎样才能更换

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

and: 和:

CGSize size = [string sizeWithFont:font];

You could try this: 你可以试试这个:

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

CGSize size = textRect.size;

Just change "FONT" for an "[UIFont font....]" 只需将“FONT”更改为“[UIFont font ....]”

As we cant use sizeWithAttributes for all iOS greater than 4.3 we have to write conditional code for 7.0 and previous iOS. 由于我们无法对大于4.3的所有iOS使用sizeWithAttributes,因此我们必须为7.0和之前的iOS编写条件代码。

1) Solution 1: 1)解决方案1:

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) Solution 2 2)解决方案2

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];

The first solution is sometime fail to return proper value of height. 第一种解决方案有时无法返回正确的高度值。 so use another solution. 所以使用其他解决方案 which will work perfectly. 这将完美地工作。

The second option is quite well and working smoothly in all iOS without conditional code. 第二个选项非常好,并且在没有条件代码的所有iOS中都能顺利运行。

Here is simple solution : 这是简单的解决方案:

Requirements : 要求 :

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

Now As constrainedToSizeusage:lineBreakMode: usage is deprecated in iOS 7.0 : 现在作为constrainedToSizeusage:lineBreakMode:iOS 7.0中不推荐使用:

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

Now usage in greater version of iOS 7.0 will be: 现在在更高版本的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;

In most cases I used the method sizeWithFont:constrainedToSize:lineBreakMode: to estimate the minimum size for a UILabel to accomodate its text (especially when the label has to be placed inside a UITableViewCell)... 在大多数情况下,我使用方法sizeWithFont:constrainedToSize:lineBreakMode:估计UILabel的最小大小以容纳其文本(特别是当标签必须放在UITableViewCell内时)...

...If this is exactly your situation you can simpy use the method: ...如果这正是您的情况,您可以简单地使用该方法:

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

Hope this might help. 希望这可能有所帮助。

Below are two simple methods that will replace these two deprecated methods. 下面是两个简单的方法,将取代这两个弃用的方法。

And here are the relevant references: 以下是相关参考资料:

If you are using NSLineBreakByWordWrapping, you don't need to specify the NSParagraphStyle, as that is the default: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index.html#//apple_ref/occ/clm/NSParagraphStyle/defaultParagraphStyle 如果您使用的是NSLineBreakByWordWrapping,则无需指定NSParagraphStyle,因为这是默认设置: https//developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index。 HTML#// apple_ref / OCC / CLM / NSParagraphStyle / defaultParagraphStyle

You must get the ceil of the size, to match the deprecated methods' results. 您必须获得该大小的ceil,以匹配已弃用的方法的结果。 https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context : 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;

[Accepted answer works nicely in a category. [接受的答案适用于某一类别。 I'm overwriting the deprecated method names. 我正在覆盖已弃用的方法名称。 Is this a good idea? 这是一个好主意吗? Seems to work with no complaints in Xcode 6.x] 似乎在Xcode 6.x中没有投诉工作]

This works if your Deployment Target is 7.0 or greater. 如果您的部署目标是7.0或更高,则此方法有效。 Category is NSString (Util) 类别是NSString (Util)

NSString+Util.h 的NSString + Util.h

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

NSString+Util.m 的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;

from two answers 1 + 2 从两个答案1 + 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 替换已弃用的“ sizeWithFont:constrainedToSize:lineBreakMode”的正确语法 - Correct syntax for replacement of deprecated “sizeWithFont:constrainedToSize:lineBreakMode” 不推荐使用sizeWithFont:constrainedToSize:lineBreakMode - sizeWithFont:constrainedToSize:lineBreakMode deprecated 'sizeWithFont:constrainedToSize:lineBreakMode:'已弃用: - 'sizeWithFont:constrainedToSize:lineBreakMode:'is deprecated: sizeWithFont:ConstrainedToSize:lineBreakMode:方法在iOS 7中已弃用 - sizeWithFont: ConstrainedToSize: lineBreakMode: method is deprecated in iOS 7 'sizeWithFont:constrainedToSize:lineBreakMode:'已被弃用:在iOS 7.0中首次弃用-使用-boundingRectWithSize:options:attributes:context: - 'sizeWithFont:constrainedToSize:lineBreakMode:' is deprecated: first deprecated in iOS 7.0 - Use -boundingRectWithSize:options:attributes:context: sizeWithFont:constrainedToSize:lineBreakMode:不准确? - sizeWithFont:constrainedToSize:lineBreakMode: not accurate? iOS是否对sizeWithFont:constrainedToSize:lineBreakMode中的空格有任何限制? - iOS Is there any limitation of white space number in sizeWithFont:constrainedToSize:lineBreakMode? iOS:UILabel动态高度使用sizeWithFont:constrainedToSize:lineBreakMode:不工作 - iOS: UILabel dynamic height using sizeWithFont:constrainedToSize:lineBreakMode: not working sizeWithFont:constrainedToSize:lineBreakMode中的内存泄漏: - Memory Leak in sizeWithFont:constrainedToSize:lineBreakMode: 在iOS 7中因过时的sizeWithFont的替换而丢失: - Lost with the replacement for deprecated sizeWithFont: in iOS 7
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM