J'ai ce problème étrange, et je m'en occupe depuis plus de 8 heures maintenant. Selon la situation, je dois calculer la UILabels
taille de manière dynamique,
par exemple
mon UIViewController
reçoit un événement et je change de UILabels
taille. du plus grand au plus petit. La taille de mon UILabel
devient plus petite et j'obtiens la bonne taille nécessaire, mais le texte de mon UILabel
reste le même, la même taille de police, etc. J'ai besoin que la police devienne plus petite, pour que le texte entier corresponde au UILabel
. La question est donc de savoir comment adapter le texte à mon étiquette autoshrinking
ou quelque chose du genre?
Dans my xib
, UILabels
autoshrink
est coché, le nombre de lignes est également défini sur 0, et ma chaîne a également de nouveaux symboles de ligne (\ n), et j'ai sélectionné le mode de saut de ligne sur wordwrap
. Peut-être que quelqu'un était dans la même situation que moi maintenant et pourrait m'aider? Ça me plairait vraiment.
Merci d'avance!
EDIT: UILabel
la taille de police minimale est fixée à 10
la source
Réponses:
Dans le cas où vous cherchez toujours une meilleure solution, je pense que c'est ce que vous voulez:
Une valeur booléenne indiquant si la taille de la police doit être réduite afin d'adapter la chaîne de titre dans le rectangle englobant de l'étiquette (cette propriété n'est effective que lorsque la
numberOfLines
propriété est définie sur 1).Lors de la définition de cette propriété,
minimumScaleFactor
DOIT également être définie (une bonne valeur par défaut est 0,5).Rapide
Objectif c
Une valeur booléenne indiquant si l'espacement entre les lettres doit être ajusté pour s'adapter à la chaîne dans le rectangle des limites de l'étiquette.
Rapide
Objectif c
Source .
la source
minimumFontSize
est obsolète dans iOS 6.0. UtilisezminimumScaleFactor
plutôt.C'est ainsi que je fais
Autoshrink
fonctionner UILabel (en particulier pour la hauteur de la police d'étiquette adaptée dans un appareil 4s à partir de 6s Plus Storyboard) dans iOS 9.2, Xcode 7.2 ...la source
minimumFontSize
est obsolète dans iOS 6.Alors utilisez à la
minimumScaleFactor
place deminmimumFontSize
.Swift 5
la source
aussi ma solution est le label booléen.adjustsFontSizeToFitWidth = YES; MAIS. Vous devez dans l'interface Builder le commutateur Word Wrapping sur " CLIP ". Puis rétrécissez automatiquement les étiquettes. C'est très important.
la source
Dans Swift 3 (par programmation), je devais faire ceci:
la source
Vous pouvez écrire comme
Vous pouvez calculer le nombre de lignes comme ça
J'espère que cela vous aidera :-) en attendant votre réponse
la source
Enfin, je n'ai pas trouvé ma réponse. Et je pense que la réduction automatique ne fonctionne pas pour plusieurs lignes. J'ai fini par utiliser la suggestion dans ce lien: autoshrink sur un UILabel avec plusieurs lignes
Les solutions sont de calculer la hauteur du texte à une largeur donnée et si le texte est plus grand, de réduire la taille de la police, puis de recommencer jusqu'à ce que la hauteur soit égale ou inférieure à la taille requise.
Je ne comprends pas pourquoi cela devrait être si difficile à mettre en œuvre. Si quelque chose me manque, tout le monde est invité à me corriger :)
la source
Ceci est pour Swift 3 exécutant Xcode 8.2.1 (8C1002)
La meilleure solution que j'ai trouvée est de définir une largeur fixe dans votre Storyboard ou IB sur l'étiquette. Définissez vos contraintes avec une contrainte aux marges. Dans votre viewDidLoad, ajoutez les lignes de code suivantes:
Cela a fonctionné comme un charme et il ne déborde pas sur une nouvelle ligne et réduit le texte pour l'adapter à la largeur de l'étiquette sans aucun problème étrange et fonctionne dans Swift 3.
la source
C'est une excellente question, car il semble que cela fasse désormais partie de la
UIKit
fonctionnalité intégrée ou d'un cadre connexe. Voici un bon exemple visuel de la question:Il n'y a pas de solution facile, mais c'est certainement possible. Une façon de procéder consiste à essayer par programme différentes tailles de police jusqu'à ce que vous en trouviez une qui se rapproche raisonnablement des limites de la vue. Vous pouvez accomplir cela avec la
boundingRect()
fonction deNSString
ouNSAttributedString
. Par exemple:Vous pouvez faire une recherche binaire pour être plus efficace qu'une approche de force brute complète. Il existe également des considérations un peu plus complexes, notamment un habillage de mots correct et des performances de mise en cache des polices iOS, si vous recherchez quelque chose de vraiment robuste.
Si vous vous souciez uniquement d'afficher le texte à l'écran de manière simple, j'ai développé une implémentation robuste dans Swift, que j'utilise également dans une application de production. C'est une
UIView
sous - classe avec une mise à l'échelle automatique et efficace des polices pour tout texte d'entrée, y compris plusieurs lignes. Pour l'utiliser, vous feriez simplement quelque chose comme:C'est tout! Vous pouvez trouver la source complète ici: https://github.com/FlickType/AccessibilityKit
J'espère que cela t'aides!
la source
Dans iOS 9, je devais simplement:
Quelqu'un a recommandé de définir le nombre de lignes sur 0, mais pour moi, cela a simplement fait passer l'étiquette sur plusieurs lignes ...
la source
UILabel
et unUITextField
dans une cellule statique et j'ai cliqué sur "Résoudre les problèmes de mise en page automatique" et "Ajouter les contraintes manquantes". Tout était aligné, mais Autoshrink avait besoin de connaître la distance par rapport à l'étiquette, pour laquelle "Ajouter des contraintes manquantes" n'ajoutait pas de contrainte.Je pense que vous pouvez écrire le code ci-dessous après alloc init Label
Cela fonctionne bien avec moi, utilisez-le
la source
Deux ans plus tard, et ce problème est toujours d'actualité ...
Dans iOS 8 / XCode 6.1, je trouvais parfois que mon
UILabel
(créé dans unUITableViewCell
, avec AutoLayout activé et des contraintes flexibles pour qu'il y ait beaucoup d'espace) ne se redimensionnait pas pour s'adapter à la chaîne de texte.La solution, comme les années précédentes, était de définir le texte, puis d' appeler
sizeToFit
.(Soupir.)
la source
Voici comment faire: Supposons que le message suivant est l'étiquette que vous souhaitez obtenir l'effet désiré.Maintenant, essayez ces simples lignes de codes:
la source
ne fonctionne pas si
numberOfLines > 1
ce que j'ai fait a créé une condition comme celle-ci-la source
Arriver en retard à la fête, mais comme j'avais l'exigence supplémentaire d'avoir un mot par ligne, cet ajout a fait l'affaire pour moi:
label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;
Apple Docs dit:
Mais c'est un mensonge. Un mensonge je vous dis! C'est vrai pour toutes les versions iOS. Plus précisément, cela est vrai lorsque vous utilisez un
UILabel
dans unUICollectionViewCell
pour lequel la taille est déterminée par des contraintes ajustées dynamiquement à l'exécution via une mise en page personnalisée (ex.self.menuCollectionViewLayout.itemSize = size
).Ainsi, lorsqu'il est utilisé en conjonction avec
adjustsFontSizeToFitWidth
etminimumScaleFactor
, comme mentionné dans les réponses précédentes, le réglage par programmenumberOfLines
basé sur le nombre de mots a résolu le problème de la réduction automatique. Faire quelque chose de similaire basé sur le nombre de mots ou même le nombre de caractères peut produire une solution «assez proche».la source
Dans Swift 4 (par programmation):
la source
Swift 4, Xcode 9.4.1
La solution qui a fonctionné pour moi: j'avais une étiquette dans une cellule de vue de collection et le texte de l'étiquette était coupé. Définissez les attributs comme ci-dessous sur Storyboard
la source