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];
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 ....]"
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.
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;
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));
}
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.
UIFont *font = [UIFont boldSystemFontOfSize:16];
CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil];
CGSize stringSize= new.size;
[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)
- (CGSize)sizeWithFont:(UIFont *) font;
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size;
- (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;