Comment ajuster la taille de la police de l'étiquette pour s'adapter à l'rectangle?
Oui, il y a ce cool myLabel.adjustsFontSizeToFitWidth = YES;
de la propriété. Mais dès que l'étiquette a deux lignes ou plus, il ne sera pas de redimensionner le texte à rien. Jusqu'à ce qu'il soit tronquée avec ... si elle ne rentre pas dans le rect.
Est-il une autre façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Si vous voulez assurez-vous que le label s'inscrit dans le rectangle à la fois la largeur et la hauteur sage, vous pouvez essayer différentes taille de la police sur l'étiquette pour voir si on va s'adapter.
Cet extrait commence à 300 pt et essaie de faire correspondre à l'étiquette dans le ciblées rectangle en réduisant la taille de la police.
Je pense que le ci-dessus explique ce qui se passe. Une mise en œuvre plus rapide pourrait utiliser la mise en cache et argarcians de recherche binaire comme suit
J'ai trouvé Niels' reponse a la meilleure réponse à ce problème. Cependant, j'ai une UIView que peut avoir 100 étiquettes où j'ai besoin d'adapter le texte, donc, ce processus a été très efficace et j'ai pu sentir le coup de la performance.
Voici son code modifié pour utiliser un binaire de recherche au lieu de cela, plutôt que d'une recherche linéaire. Maintenant, il fonctionne de manière très efficace.
De crédit va à https://gist.github.com/988219
Voici Swift version selon @NielsCastle réponse, à l'aide de la recherche binaire
Utilisation
souvent juste
UILabel
considérablement élevé, alors la taille de police de calcul de la baise et elle va au-delà de la largeur. Va essayer de résoudre ce bug et de poster ici.Cette solution (basé sur cette réponse) fonctionne avec mise en page automatique et effectue une recherche binaire pour trouver la meilleure taille de la police.
Le seul inconvénient que j'ai trouvé, c'est que vous ne pouvez pas spécifier le nombre de lignes (parce que autant que je sache, vous ne pouvez pas dire
boundingRectWithSize
le nombre de lignes que vous voulez).AdjustableLabel.h
AdjustableLabel.m
Utilisation
// If there is only one word, then reduce the height so as to force boundingRectWithSize to fit it on
// one line.
//
if ([label.text componentsSeparatedByString:@" "].count == 1) {
` labelSize.hauteur /= 2.0;`}
juste après la déclaration de labelSize.Voici une rapide extension pour UILabel. Il exécute une recherche binaire de l'algorithme de redimensionnement de la police et des limites de l'étiquette, et est testé pour iOS 12.
UTILISATION: Redimensionne la police pour s'adapter à une taille de 100x100 (précis à moins de 1,0 point de police) et s'aligne à l'.
Copier/Coller la ligne suivante dans votre fichier:
Cette fonction ne changer la taille de l'étiquette, seul le
font
propriété est affectée. Vous pouvez utiliser le retour de la taille de la valeur à ajuster la mise en page de l'étiquette.var
paramètre dans la déclaration de fonction est en fait obsolète et sera supprimée dans Swift 3.sizeToFit
avecsizeThatFits
donc l'appel de cette méthode n'affecte pas l'étiquette de l'image et travaille avec des contraintes assez bien. Aussi, j'ai ajouté de la pratique de la valeur de retour, lesquels peuvent être utilisées pour la mise en page des réglages. Certains des appels redondants où retiré.Si quelqu'un est à la recherche d'un MonoTouch/Xamarin.iOS mise en œuvre, comme je l'ai fait ... ici, vous allez:
C'est une traduction de agarcian du code Objective-C, C#, avec une petite modification: le retour de résultat a toujours été de 0 (voir le commentaire de complètement foireuse) je suis de retour la calculés minFontSize, ce qui donne une taille de police correct.
Également définir
myLabel.numberOfLines = 10
ou quel que soit le nombre maximum de lignes que vous le souhaitez.Tous ces sont des solutions intéressantes pour le problème original, cependant elles sont toutes aussi manque une chose importante: Si vous fier uniquement sur la nomdefamille pour obtenir le prochaine police pour tester, vous perdez les informations de poids et peut-être plus avancé des attributs comme des petites capitales, figure de style, etc.
Une meilleure approche est qu'au lieu de passer le nom de la police autour et faire
[UIFont fontWithName:someFontName size:someFontSize]
, en passantUIFontDescriptor
objets, et ensuite faire[UIFont fontWithDescriptor:someFontDescriptor size:someFontSize]
.Car je ne trouvais pas une solution de travail de répondre à tous mes besoins à l'aide des réponses ci-dessus, j'ai créé mes propres composants offrant les fonctionnalités suivantes:
FittableFontLabel
NSAttributedStrings
ainsi que la chaîne de baseSi l'un de vous qui est intéressant, c'est toute une bibliothèque swift disponibles à l'aide de
CocoaPods: https://github.com/tbaranes/FittableFontLabel
Niels Château du code du travail.
Ici est la même idée avec une autre mise en œuvre.
Ma solution est plus précise, mais aussi beaucoup plus consommateur d'UC.
Ajouter cette fonction à une classe qui hérite UILabel.
J'ai créé une Catégorie pour UILabel basé sur @agarcian de réponse. Mais je calculer fontSize selon carrés nécessaires sur l'écran pour dessiner le texte. Cette méthode n'est pas besoin de boucles et le calcul est fait en une seule itération.
Ici la .h fichier:
Et ici la .m fichier:
Tous les binaires de recherches sont bonnes, mais l'arrêt de la récursivité à l'aide de cadre vérifie pas si logiquement. Plus de bien vérifier la taille de la police, la cause UIFont prend en charge float taille et de cette police est plus approprié.
Plus à l'aide de l'étiquette de style de paragraphe pour calculer la taille de mory exactement.
Si quelqu'un d'intéressant, vous pouvez regarder soufflet code:
Swift 3 "binaires de recherche de solution" basée sur cette réponse avec quelques améliorations mineures. L'échantillon est dans le contexte de
UITextView
sous-classe:J'espère que ça aide quelqu'un.
greatestFiniteMagnitude
à la largeur, commeCGSize(width: bounds.width, height: .greatestFiniteMagnitude)
@agarcian la réponse était proche, mais il n'a pas assez de travail pour moi, comme quelqu'un d'autre a mentionné dans un commentaire, il retourne toujours 0.
Ici est une tentative de ma part.
Cheers!