326 votes

Remplacement pour sizeWithFont obsolète : iOS 7 ?

Dans iOS 7, est maintenant obsolète. Comment j’ai maintenant passer à l’objet UIFont dans la méthode de remplacement ?

525voto

Incyc Points 3813

Utilisation au lieu de cela, qui maintenant prend un . Passer de la paire avec la clé `` et votre objet font comme ceci :

173voto

Mr. T Points 4405

Je crois que la fonction est obsolète parce que la série de NSString+UIKit fonctions (sizewithFont:..., etc), basés sur les UIStringDrawing de la bibliothèque, ce qui n'est pas thread-safe. Si vous avez essayé d'exécuter leur pas sur le thread principal (comme tous les autres UIKit fonctionnalité), vous obtiendrez des comportements imprévus. En particulier, si vous avez exécuté la fonction sur plusieurs threads simultanément, il va probablement provoquer une panne de votre application. C'est pourquoi, dans iOS 6, ils ont présenté un de la boundingRectWithSize:... méthode pour NSAttributedStrings. Cela a été construit sur le sommet de la NSStringDrawing bibliothèques et est thread-safe.

Si vous regardez la nouvelle NSString boundingRectWithSize:... de la fonction, il demande de l'un des attributs de tableau de la même manière qu'un NSAttributeString. Si je devais deviner, cette nouvelle NSString fonction dans iOS 7 est qu'un wrapper pour la NSAttributeString fonction à partir d'iOS 6.

Sur cette note, si vous avez été seulement soutenir l'iOS 6 et iOS 7, alors je n'hésiterais pas à changer la totalité de votre NSString de l' sizeWithFont:... de la NSAttributeString de l' boundingRectWithSize. Il va vous faire économiser beaucoup de maux de tête si vous avez une drôle de multi-threading cas de coin! Voici comment je les ai converti en NSString de l' sizeWithFont:constrainedToSize::

Ce qui a été utilisé:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font 
               constrainedToSize:(CGSize){width, CGFLOAT_MAX}];

Peut être remplacé par:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
    [[NSAttributedString alloc]
        initWithString:text
        attributes:@
        {
            NSFontAttributeName: font
        }];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;

Veuillez noter que la documentation mentionne:

Dans iOS 7 et versions ultérieures, cette méthode retourne les fractions de tailles (de la taille composant de retour de la CGRect); utiliser un retour de la taille à la taille vues, vous devez utiliser accroître sa valeur la plus proche à la plus élevée entier à l'aide de la fonction ceil.

Donc, pour tirer le calcul de la hauteur ou la largeur d'être utilisées pour le dimensionnement des points de vue, je voudrais utiliser:

CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);

29voto

Ayush Points 2331

Comme vous pouvez le voir sizeWithFont au site des Développeurs Apple, il est obsolète, donc nous avons besoin d'utiliser sizeWithAttributes.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

NSString *text = @"Hello iOS 7.0";
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
    // code here for iOS 5.0,6.0 and so on
    CGSize fontSize = [text sizeWithFont:[UIFont fontWithName:@"Helvetica" 
                                                         size:12]];
} else {
    // code here for iOS 7.0
   CGSize fontSize = [text sizeWithAttributes: 
                            @{NSFontAttributeName: 
                              [UIFont fontWithName:@"Helvetica" size:12]}];
}

17voto

Rom. Points 416

J'ai créé une catégorie pour gérer ce problème, la voici:

 #import "NSString+StringSizeWithFont.h"

@implementation NSString (StringSizeWithFont)

- (CGSize) sizeWithMyFont:(UIFont *)fontToUse
{
    if ([self respondsToSelector:@selector(sizeWithAttributes:)])
    {
        NSDictionary* attribs = @{NSFontAttributeName:fontToUse};
        return ([self sizeWithAttributes:attribs]);
    }
    return ([self sizeWithFont:fontToUse]);
}
 

De cette façon, vous n'avez qu'à trouver / remplacer sizeWithFont: avec sizeWithMyFont: et vous êtes prêt à partir.

10voto

user3055587 Points 41

Dans iOS7 j'avais besoin de la logique pour retourner la bonne hauteur pour la méthode tableview: heightForRowAtIndexPath, mais la tailleWithAttributes retourne toujours la même hauteur indépendamment de la longueur de la chaîne car elle ne sait pas qu'elle va être placée dans une cellule de table de largeur fixe . J'ai trouvé que cela fonctionne très bien pour moi et calcule la hauteur correcte en tenant compte de la largeur de la cellule de table! Ceci est basé sur la réponse de M. T ci-dessus.

 NSString *text = @"The text that I want to wrap in a table cell."

CGFloat width = tableView.frame.size.width - 15 - 30 - 15;  //tableView width - left border width - accessory indicator - right border width
UIFont *font = [UIFont systemFontOfSize:17];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;
size.height = ceilf(size.height);
size.width  = ceilf(size.width);
return size.height + 15;  //Add a little more padding for big thumbs and the detailText label
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X