81 votes

sizeWithFont méthode est obsolète. boundingRectWithSize est le retour des valeurs erronées

Dans iOS7, sizeWithFont est obsolète, j'ai donc utilisé boundingRectWithSizeméthode pour cela. C'est même comme je suis en utilisant sizeWithFont. boundingRectWithSize est de retour CGRect valeur. J'utilise comme ceci

 UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
                    // you can use your font.

 CGSize maximumLabelSize = CGSizeMake(310, 9999);

 CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                             options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{NSFontAttributeName:fontText}
                             context:nil];

 expectedLabelSize = CGSizeMake(textRect.size.width, textRect.size.height);

Dans textRect, je m taille plus que j'ai donné en maximumLabelSize. De même, je m arriver de taille différente avec sizeWithFont méthode. Comment puis-je résoudre ce problème.

151voto

Quang Hà Points 1289

Comment créer une nouvelle étiquette et à l'aide de sizeThatFit:(CGSize)taille ??

UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"YOUR FONT's NAME" size:16];
gettingSizeLabel.text = @"YOUR LABEL's TEXT";
gettingSizeLabel.numberOfLines = 0;
gettingSizeLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(310, 9999);

CGSize expectSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

35voto

Maksim Pavlov Points 179

Peut-être vous avez besoin de fournir une option supplémentaire à la méthode qui est suggéré dans cette réponse:

CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                                         options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                      attributes:@{NSFontAttributeName:fontText}
                                         context:nil];

15voto

Enrico Szonn Points 51

Voici mon code de travail extrait:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];

NSString *headline  = [dict objectForKey:@"title"];  
UIFont *font        = [UIFont boldSystemFontOfSize:18];  
CGRect  rect        = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];

CGFloat height      = roundf(rect.size.height +4)

J'ai ajouté 4px pour le calcul de la hauteur, parce que sans ces 4px, il y a une ligne manquante.

J'utilise ce bout de code dans un tableView et ajouter la "hauteur" d'un tableau de NSNumbers et j'ai trouver la bonne hauteur de cellule par défaut textLabel.

Ajouter un peu plus de 4 pixels si vous voulez plus d'espace sous le texte dans la textLabel.

** Mise à JOUR **

Je ne suis pas d'accord avec le "largeur bug de 40px", je crie être le 4px de manque de hauteur, parce que 4px est la hauteur par défaut d'un espace entre une lettre et la limite d'une seule ligne. Vous pouvez le vérifier avec un UILabel, pour un fontsize de 16 vous avez besoin d'un UILabel hauteur de 20.

Mais si votre dernière ligne n'a pas de "g" ou que ce soit, la mesure pourrait manquer le 4px de hauteur.

J'ai revérifié avec un peu de méthode, j'obtiens un précis de la hauteur de 20,40 ou 60 pour mon label et un droit de la largeur de moins de 300px.

À l'appui de iOS6 et iOS7, vous pouvez utiliser ma méthode:

- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
    CGRect rect;

    float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (iosVersion >= 7.0) {
        rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
    }
    else {
        CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
        rect = CGRectMake(0, 0, size.width, size.height);
    }
    NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
    return rect.size.height;
}

2voto

vinaut Points 1873

Si je comprends bien, vous êtes à l'aide de boundingRectWithSize: tout comme un moyen d'obtenir la taille que vous obtiendriez avec sizeWithFont (ce qui signifie que vous voulez directement à la CGSize, pas la CGRect)?

Cela ressemble à ce que vous recherchez :

Remplacement déprécié sizeWithFont: dans iOS 7?

Ils sont à l'aide de sizeWithAttributes: pour obtenir la taille, comme un remplacement pour sizeWithFont.

Etes-vous toujours de la bonne taille à l'aide de quelque chose comme ceci :

UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
                    // you can use your font.

expectedLabelSize = [myString sizeWithAttributes:@{NSFontAttributeName:fontText}];

1voto

Pratik Points 1764

pour trouver la taille de l'étiquette de l'exécution sizewithfont est déconseillé pour iOS 7.0 au lieu de cela, vous devez utiliser -boundingRectWithSize:options:attributs:contexte: la méthode

vous pouvez l'utiliser comme code ci-dessous

CGSize constraint = CGSizeMake(MAXIMUM_WIDHT, TEMP_HEIGHT);
NSRange range = NSMakeRange(0, [[self.message body] length]);

NSDictionary *attributes = [YOUR_LABEL.attributedText attributesAtIndex:0 effectiveRange:&range];
CGSize boundingBox = [myString boundingRectWithSize:constraint options:NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
int numberOfLine = ceil((boundingBox.width) / YOUR_LABEL.frame.size.width);
CGSize descSize = CGSizeMake(ceil(boundingBox.width), ceil(self.lblMessageDetail.frame.size.height*numberOfLine));

CGRect frame=YOUR_LABEL.frame;
frame.size.height=descSize.height;
YOUR_LABEL.frame=frame;

ici, vous devez donner la largeur à la longueur maximale pour trouver la hauteur ou la largeur.

essayez ceci c'est de travailler pour moi.

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