web-dev-qa-db-fra.com

Remplacement pour obsolète -sizeWithFont: constrainedToSize: lineBreakMode: dans iOS 7?

Dans iOS 7, la méthode:

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

et la méthode:

- (CGSize)sizeWithFont:(UIFont *)font

sont obsolètes. Comment puis-je remplacer 

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

et:

CGSize size = [string sizeWithFont:font];
142
user_Dennis_Mostajo

Vous pouvez essayer ceci:

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

CGSize size = textRect.size;

Il suffit de changer "FONT" pour un "[police UIFont ....]"

214
Xavier Maroñas

Comme nous ne pouvons pas utiliser sizeAvecAttributs pour toutes les iOS supérieures à 4.3, nous devons écrire du code conditionnel pour 7.0 et les versions précédentes.

1) Solution 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

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

La première solution est parfois de ne pas retourner la valeur correcte de height. alors utilisez une autre solution. qui fonctionnera parfaitement.

La deuxième option est très bien et fonctionne bien dans toutes les iOS sans code conditionnel. 

35
Nirav

Voici une solution simple:

Exigences : 

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

Désormais, l'utilisation de constrainedToSizeusage:lineBreakMode: est obsolète dans iOS 7.0 :

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

Maintenant, l'utilisation dans supérieure version de iOS 7.0 sera:

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

Vous trouverez ci-dessous deux méthodes simples qui remplaceront ces deux méthodes obsolètes. 

Et voici les références pertinentes:

Si vous utilisez NSLineBreakByWordWrapping, vous n'avez pas besoin de spécifier le NSParagraphStyle, car il s'agit du paramètre par défaut: https://developer.Apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes /NSParagraphStyle_Class/index.html#//Apple_ref/occ/clm/NSParagraphStyle/defaultParagraphStyle

Vous devez obtenir le plafond de la taille, correspondant aux résultats des méthodes dépréciées . https://developer.Apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//Apple_ref/occ/instm/NSString/boundingRectWithSize: options: attributs: contexte :

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

Dans la plupart des cas, j'ai utilisé la méthode sizeWithFont: constrainedToSize: lineBreakMode: pour estimer la taille minimale d'un UILabel pour adapter son texte (en particulier lorsque l'étiquette doit être placée à l'intérieur d'un UITableViewCell) ...

... Si c'est exactement votre situation, vous pouvez simplement utiliser la méthode suivante:

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

J'espère que cela pourrait aider.

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

[Réponse acceptée fonctionne bien dans une catégorie. J'écrase les noms de méthodes obsolètes. Est-ce une bonne idée? Semble fonctionner avec aucune plainte dans Xcode 6.x]

Cela fonctionne si votre cible de déploiement est 7.0 ou plus. La catégorie est 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;

à partir de deux réponses 1 + 2

0
Alex