Le Calcul De UILabel La Taille Du Texte
Je suis de dessin UILabels
par programmation. Ils obtiennent leurs tailles à partir d'une base de données. Donc, je ne peux pas simplement sizeToFit
. J'ai déjà mis en place une fonction qui redessine UILabels
avec un passé ratio. Donc tout ce que je besoin de trouver le texte dans UILabel
de mon point de vue qui obligerait le ratio maximum de redessiner UILabels
.
Donc, finalement, j'ai besoin de faire quelque chose comme ceci:
double ratio = 1.00;
for (UILabel* labels in sec.subviews) {
float widthLabel = labels.frame.size.width;
float heightLabel = labels.frame.size.height;
float heightText = //get the text height here
float widthText = //get the text width here
if (widthLabel < widthText) {
ratio = MAX(widthText/widthLabel,ratio);
}
if (heightLabel < heightText) {
ratio = MAX(heightText/heightLabel, ratio);
}
}
//redraw UILabels with the given ratio here
Alors, comment puis-je obtenir la hauteur et la largeur de la taille d'un texte, comme certains de mes texte ne correspond pas à l'étiquette, je ne peut pas simplement utiliser l'étiquette de limite? J'utilise Xcode 5 et iOS 7.
Vous devez vous connecter pour publier un commentaire.
Tous les
[NSString sizeWithFont...]
méthodes sont déconseillés dans iOS 7. Utiliser ce lieu.Voir aussi https://developer.apple.com/documentation/foundation/nsstring/1619914-sizewithfont.
Mise à JOUR - exemple de boundingRectWithSize sortie
Par votre commentaire, j'ai fait un test simple. Le code et la sortie est ci-dessous.
ce produit la sortie suivante (notez que les limites de changement comme prévu que la taille de la police devient plus):
label.font.pointSize
vous donnera la taille de la police pour une étiquette. Si vous vous demandez comment savoir quelle taille de police à utiliser pour le calcul de limites, sans avoir l'étiquette de l'objet, alors oui, vous avez le code que de la même manière que le code de configuration de la police de l'étiquette (c'est à dire cependant que vous souhaitez pour votre application).UIFont
taille 18, je suis "{49.337997, 42.947998}" tailles pour mon texte. Lorsque je fais 14 alors le résultat est "{55.244003, 50.105999}" si je le fais, 12 ensuite, il est "{47.736, 42.947998}". Si pour une raison quelconque, il ne donne pas la taille exacte.boundingRectWithSize:CGSizeMake(200, 0)
est inférieure à l'espace dont vous avez besoin, disons 100,0? Puis je voudrais obtenir: fontSize = 12.000000 limites = (84.167999 x 71.580002) fontSize = 14.000000 limites = (97.412003 x 83.509995) fontSize = 18.000000 limites = (89.027992 x 150.317993) C'est, je crois, où le problème est que j'utilise la taille de l'étiquette enboundingRectWithSize
qui, essentiellement, est inférieure à la taille du texte et, par conséquent, produit de tels résultats. Est-il possible de résoudre ce sans avoir à coder en dur ces CGRect?UILabel
avecadjustFontSizeToFitWidth
etminimumScaleFactor
et iOS va faire le travail pour vous.Longueur obtient le nombre de caractères. Si vous souhaitez obtenir la largeur du texte:
Objective-C
Swift 4
Cela vous arrive à la taille. Et vous pouvez comparer les
textSize.width
de chaque étiquette.Un autre moyen simple de faire ce que je n'ai pas vu encore mentionné:
(Cela ne fonctionnera correctement après que vous avez mis le texte de l'étiquette et de la police, bien sûr.)
Ici est une swift variante.
Peu de les conseils les gars, si comme moi vous utilisez,
boundingRectWithSize
avec[UIFont systemFontOFSize:14]
Si votre chaîne est deux lignes de long, le retour de l'rect hauteur est quelque chose comme 33,4 points.
Ne faites pas l'erreur, comme moi, de le jeter dans un
int
, parce que 33,4 devient 33 et 33 points de la hauteur de l'étiquette de passer de deux à une seule ligne!int
pour les tailles d'écran ou de l'emplacement, il suffit de coller àCGFloat
.CGFloat
(par exemplevar x:CGFloat = 14
)Le problème avec
est
boundingRectWithSize
qui détermine la valeur maximale que CGRect peut avoir.Ma solution de ce problème consiste à vérifier si elle est supérieure, si non, alors le texte peut s'intégrer dans l'étiquette. Je l'ai fait par à l'aide de boucles.
Après chaque itération de la taille de la hauteur et la largeur des incréments de 10% de sa valeur.
La raison pourquoi j'ai choisi 6 est parce que je ne voulais pas l'étiquette d'être trop visqueux.
Pour une solution à ne pas utiliser de boucles:
Où la dernière boucle est la preuve que la plus grande police peut donner une meilleure taille de résultat.
En utilisant cette ligne de code, nous pouvons obtenir la taille du texte sur l'étiquette.
Donc, nous pouvons utiliser la largeur et en hauteur.
Une solution qui fonctionne avec étiquettes multilignes (Swift 4), pour calculer la hauteur d'une largeur fixe:
msgStr chaîne d'obtenir la taille :
Swift 3.0