web-dev-qa-db-ja.com

非推奨の-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];
142

これを試すことができます:

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

CGSize size = textRect.size;

「[UIFont font ....]」の「FONT」を変更するだけです

214
Xavier Maroñas

4.3を超えるすべてのiOSでsizeWithAttributesを使用することはできないため、7.0および以前のiOSの条件付きコードを記述する必要があります。

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)解決策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];

最初の解決策は、高さの適切な値を返すことができない場合があるため、別の解決策を使用します。完全に機能します。

2番目のオプションは非常によく、条件付きコードなしですべてのiOSでスムーズに動作します。

35
Nirav

ここに簡単な解決策があります:

要件:

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

現在、constrainedToSizeusage:lineBreakMode:の使用はiOS 7.で非推奨になっています:

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

greaterバージョンのiOS 7.での使用は次のようになります。

// 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;
9
Paresh Navadiya

以下は、これらの2つの非推奨メソッドを置き換える2つの単純なメソッドです。

また、関連するリファレンスは次のとおりです。

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));
}
6
Harris

ほとんどの場合、メソッドsizeWithFont:constrainedToSize:lineBreakMode:を使用して、ILabelの最小サイズを推定し、テキストを収容します(特に、ラベルをUITableViewCell)...

...これがexactlyである場合、メソッドを簡単に使用できます:

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

これが役立つことを願っています。

6
roberto.buratti
UIFont *font = [UIFont boldSystemFontOfSize:16];
CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil];
CGSize stringSize= new.size;
3
user3575114

[受け入れられた答えは、カテゴリーでうまく機能します。非推奨のメソッド名を上書きしています。これはいいアイデアですか? 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;
}
2
Dan Rosenstark
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;

2つの回答から 1 + 2

0
Alex