web-dev-qa-db-ger.com

Ersatz für veraltet -sizeWithFont: constrainedToSize: lineBreakMode: in iOS 7?

In iOS 7 ist die Methode:

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

und die Methode:

- (CGSize)sizeWithFont:(UIFont *)font

sind veraltet. Wie kann ich ersetzen? 

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

und:

CGSize size = [string sizeWithFont:font];
142

Sie könnten dies versuchen:

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

CGSize size = textRect.size;

Ändern Sie einfach "FONT" für eine "[UIFont-Schrift ....]"

214
Xavier Maroñas

Da wir sizeWithAttributes nicht für alle iOS größer als 4.3 verwenden können, müssen wir bedingten Code für 7.0 und das vorherige iOS schreiben.

1) Lösung 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) Lösung 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];

Die erste Lösung ist manchmal nicht in der Lage, den richtigen Wert für die Höhe zurückzugeben. Verwenden Sie also eine andere Lösung. das wird perfekt funktionieren.

Die zweite Option ist ziemlich gut und funktioniert reibungslos in allen iOS ohne bedingten Code. 

35
Nirav

Hier ist eine einfache Lösung:

Bedarf : 

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

Now As constrainedToSizeusage:lineBreakMode: ist in iOS 7.0 veraltet.

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

Die Verwendung in grösser Version von iOS 7.0 ist nun:

// 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

Im Folgenden finden Sie zwei einfache Methoden, die diese beiden veralteten Methoden ersetzen. 

Und hier sind die relevanten Referenzen:

Wenn Sie NSLineBreakByWordWrapping verwenden, müssen Sie den NSParagraphStyle nicht angeben, da dies die Standardeinstellung ist: https://developer.Apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes /NSParagraphStyle_Class/index.html#//Apple_ref/occ/clm/NSParagraphStyle/defaultParagraphStyle

Sie müssen die Obergrenze der Größe ermitteln, um mit den Ergebnissen der veralteten Methoden übereinzustimmen https://developer.Apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//Apple_ref/occ/instm/NSString/boundingRectWithSize: Optionen: Attribute: Kontext :

+ (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

In den meisten Fällen habe ich die Methode sizeWithFont: constrainedToSize: lineBreakMode: verwendet, um die Mindestgröße für ein UILabel zu schätzen, um dessen Text aufzunehmen (insbesondere wenn das Label in einer UITableViewCell platziert werden muss).

Wenn dies genauIhre Situation ist, können Sie einfach die Methode verwenden:

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

Hoffe das könnte helfen.

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

[Die akzeptierte Antwort funktioniert gut in einer Kategorie. Ich überschreibe die veralteten Methodennamen. Ist das eine gute Idee? Scheint in Xcode 6.x ohne Beanstandungen zu funktionieren]

Dies funktioniert, wenn Ihr Bereitstellungsziel 7.0 oder höher ist. Kategorie ist 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;

aus zwei Antworten 1 + 2

0
Alex