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