Le redimensionnement d'un UILabel pour accueillir les encarts
Je suis en train de construire un écran permettant de scanner des codes-barres, et j'ai besoin de mettre un écran translucide derrière certains UILabels
pour améliorer la visibilité à l'encontre de fond clair.
Voici ce que l'écran ressemble à ça:
Je suis réglage de la couleur d'arrière-plan sur la UILabel
pour obtenir les boîtes translucides. J'ai également créé un custom UILabel
sous-classe permettez-moi de mettre du rembourrage entre le bord de la UILabel
et le texte à l'aide cette approche.
Comme vous pouvez le voir dans l'écran ci-dessus, le UILabel
n'est pas redimensionnée correctement pour prendre le rembourrage en compte. Le "padding" déplace simplement sur le texte sans modifier la largeur de l'étiquette, provoquant le texte à tronquer.
À la fois de ces étiquettes contiennent des textes de longueurs arbitraires, et j'ai vraiment besoin de la UILabel
de redimensionner dynamiquement.
Ce UILabel
méthode puis-je remplacer pour augmenter la largeur de l'étiquette et le facteur dans le rembourrage?
- Comment cela est-il chargé? si vous êtes à l'aide d'un storyboard, avez-vous charge de cette étiquette à l'aide? et si vous l'avez fait, avez-vous d'ajouter des contraintes à ce label et de définir la taille d'un nombre constant?
- Les bonnes questions. Ce point de vue est construit entièrement en code. Je suis en utilisant des contraintes de disposer de l'écran, et les seules contraintes sur les étiquettes de définir la position sur l'écran, pas la taille de l'étiquette.
- ok, eh bien, il est probablement juste un problème avec le texte étant trop long. Je dirais juste que l'étiquette plus large entièrement, ou encore l'adaptation de la largeur de l'étiquette en fonction de combien de temps le texte est en elle
- L'adaptation de la largeur de l'étiquette en fonction de la longueur du texte est exactement ce que je suis après, mais le calcul que, en dehors de la UILabel est stupide. Je suis l'espoir d'apprendre ce UILabel méthode je peux remplacer pour recalculer la taille de l'étiquette à intégrer le rembourrage.
- check this out: stackoverflow.com/questions/13237353/...
- Merci, mais
sizeToFit
ne prend pas en compte la marge. J'ai essayé primordialsizeToFit
etsizeThatFits
pour augmenter la largeur de larect
, mais il ne semble pas avoir d'effet. - Essayez de remplacer
-textRectForBounds:limitedToNumberOfLines:
trop - Double Possible de UILabel marge de texte
- Extension pour UILabel Meilleure solution
Vous devez vous connecter pour publier un commentaire.
Voici une étiquette de classe qui calcule les tailles correctement. Le posté code est en Swift 3, mais vous pouvez également télécharger Swift 2 ou Objective-C versions.
Comment ça fonctionne?
En calculant le bon textRect tous les
sizeToFit
et de mise en page automatique des trucs fonctionne comme prévu. Le truc, c'est d'abord soustraire les encarts, puis calculer l'étiquette originale de limites, et enfin ajouter les encarts de nouveau.Code
En option: Interface Builder
Si vous souhaitez configurer les encarts de texte dans les storyboards vous pouvez utiliser l'extension suivante pour activer l'Interface du Générateur de soutien:
Maintenant, vous pouvez facilement configurer votre encarts dans de l'IB et appuyez ensuite sur ⌘= pour ajuster l'étiquette de la taille pour s'adapter à.
Avertissement:
Tout le code est dans le domaine public. Faire comme vous s'il vous plaît.
rect
vous pouvez utiliserCGRectInset
à la place. Comme ceci:return CGRectInset(rect, -insets.left, insets.top);
developer.apple.com/library/mac/documentation/graphicsimaging/...CGRectInset
ne fonctionne que lorsque les encarts sont symétriques.textInset
peut-être un meilleur nom.intrinsicContentSize
utilisetextRectForBounds
pour calculer la bonne valeur de retour. En est de même poursizeToFit
et coll.textRectForBounds
? Cela a été mon expérience en tant que bien, mais la documentation seuls les états: "Cette méthode peut être appelé par le système s'il y avait un appel antérieur à l' *sizeToFit ou *sizeThatFits: méthode".Ici est une Swift version d'un UILabel sous-classe (comme @Nikolai réponse) qui crée un rembourrage supplémentaire autour du texte d'un UILabel:
Ici est la version de C# (utile pour Xamarin) basé sur Nikolai code :
Des acquisitions d' Nikolai Ruhe's réponse, vous avez besoin d'invalider intrinsèque de la taille du contenu pour la mise en page automatique pour recalculer correctement les changements de taille. Vous remarquerez que ce problème si vous modifiez edgeInsets sur le cycle de vie des applications:
Swift version 5 de Nikolai Ruhe réponse:
Voici un exemple de ce que j'ai utilisé pour une simple unité de 10 rembourrage sur la gauche et à droite de l'étiquette avec des coins arrondis. Il suffit de régler le texte de l'étiquette au centre, c'est l'auto et faire c'est la classe IndentedLabel et le reste prendra soin de lui-même. Pour modifier le remplissage seulement à l'échelle vers le haut ou vers le bas rect.taille.largeur += (x)
Voici un rapide, hacky façon de le faire que vous pouvez comprendre plus rapidement. Ce n'est pas aussi robuste que Nikolai, mais il fait le travail. Je l'ai fait quand j'ai essayé d'adapter mon texte dans mon UILabel dans un UITableViewCell:
let messageTextSize: CGSize = (messageText as NSString).sizeWithAttributes([
NSFontAttributeName: UIFont.systemFontOfSize(14.0)])
cell.widthConstraint.constant = messageTextSize.width + myInsetsOrWhatever
Je n'ai pas testé encore, vous pourriez avoir à jouer avec l'exacte CGFloat valeurs que vous ajoutez. J'ai trouvé que la taille n'est pas exactement la largeur de plus encarts, c'est un peu plus grand que cela. Cela permet de s'assurer que la largeur de la UILabel sera toujours au moins la taille du texte ou plus.