web-dev-qa-db-fra.com

Comment obtenir la taille d'une chaîne NSString

Un "quicky": comment puis-je obtenir la taille (largeur) d'une chaîne NSString?

J'essaie de voir si la largeur d'une chaîne pour voir si elle est plus grande qu'une largeur d'écran donnée, cas dans lequel je dois la "recadrer" et l'ajouter avec "...", obtenant le comportement habituel d'un UILabel. string.length ne fera pas l'affaire car AAAAAAAA et iiiiii ont la même longueur mais des tailles différentes (par exemple).

Je suis un peu coincé.

Merci beaucoup.

30
camilo

Il s'agit d'une approche différente. Découvrez la taille minimale du texte pour qu'il ne soit pas enroulé sur plusieurs lignes. Si elle s'étend sur plus d'une ligne, vous pouvez le découvrir en utilisant la hauteur.

Vous pouvez utiliser ce code:

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *myString = @"This is a long string which wraps";
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize myStringSize = [myString sizeWithFont:myFont 
                           constrainedToSize:maximumSize 
                               lineBreakMode:self.myLabel.lineBreakMode];

300 est la largeur de l'écran avec un peu d'espace pour les marges. Vous devez remplacer vos propres valeurs par la police et la taille, et par le lineBreakMode si vous n'utilisez pas IB.

Maintenant, myStringSize contiendra un height que vous pouvez vérifier par rapport à la hauteur de quelque chose que vous savez ne faire qu'une ligne de haut (en utilisant la même police et la même taille). S'il est plus grand, vous devrez couper le texte. Notez que vous devez ajouter un ... à la chaîne avant de le vérifier à nouveau (l'ajout du ... pourrait le pousser à nouveau au-dessus de la limite).

Mettez ce code dans une boucle pour couper le texte, puis vérifiez à nouveau la hauteur correcte.

38
nevan king

Utilisez la méthode ci-dessous.

Objectif-C

- (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
    CGSize size = CGSizeZero;
    if (text) {
        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height + 1);
    }
    return size;
}

Swift 3.

func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize {
    var size = CGSizeZero
    if text {
        var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
        size = CGSize(width: frame.size.width, height: frame.size.height + 1)
    }
    return size
}
12
Himanshu padia

Vous devez utiliser Core Graphics pour mesurer la chaîne, telle que rendue dans la police et la taille spécifiées. Voir les réponses à Mesurer la largeur en pixels d'une chaîne pour une procédure pas à pas.

4
Jakob Borg
sizeWithFont:constrainedToSize:lineBreakMode 

est obsolète maintenant. Utilisez l'extrait de code ci-dessous,

UIFont *font=[UIFont fontWithName:@"Arial" size:16.f];

NSString *name = @"Apple";

CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];
3
Gobi M