Bien que la question se déclare par programme, ayant rencontré le même problème et préférant travailler dans Interface Builder, j'ai pensé qu'il pourrait être utile d'ajouter aux réponses existantes avec une solution Interface Builder.
La première chose est d'oublier sizeToFit
. La disposition automatique gérera cela en votre nom en fonction de la taille du contenu intrinsèque.
Le problème est donc de savoir comment obtenir une étiquette pour l'adapter à son contenu avec la mise en page automatique? Plus précisément - parce que la question le mentionne - la hauteur. Notez que les mêmes principes s'appliquent à la largeur.
Commençons donc par un exemple d'UILabel dont la hauteur est fixée à 41 px de haut:
Comme vous pouvez le voir dans la capture d'écran ci-dessus, "This is my text"
a un rembourrage au-dessus et en dessous. C'est un remplissage entre la hauteur de l'UILabel et son contenu, le texte.
Si nous exécutons l'application dans le simulateur, bien sûr, nous voyons la même chose:
Maintenant, sélectionnons UILabel dans Interface Builder et examinons les paramètres par défaut dans l'inspecteur de taille:
Notez la contrainte mise en évidence ci-dessus. Telle est la priorité du contenu . Comme le décrit Erica Sadun dans l'excellent iOS Auto Layout Demystified , c'est:
la façon dont une vue préfère éviter un remplissage supplémentaire autour de son contenu principal
Pour nous, avec l'UILabel, le contenu principal est le texte.
Nous arrivons ici au cœur de ce scénario de base. Nous avons donné à notre étiquette de texte deux contraintes. Ils sont en conflit. On dit "la hauteur doit être égale à 41 pixels de haut" . L'autre dit "embrassez la vue sur son contenu afin que nous n'ayons pas de remplissage supplémentaire" . Dans notre cas, étreignez la vue sur son texte pour ne pas avoir de remplissage supplémentaire.
Maintenant, avec la mise en page automatique, avec deux instructions différentes qui disent faire des choses différentes, le moteur d'exécution doit choisir l'une ou l'autre. Il ne peut pas faire les deux. Le UILabel ne peut pas avoir à la fois 41 pixels de haut et n'a pas de remplissage.
La façon dont cela est résolu est de spécifier la priorité. Une instruction doit avoir une priorité plus élevée que l'autre. Si les deux instructions disent des choses différentes et ont la même priorité, une exception se produira.
Alors, essayons. Ma contrainte de hauteur a une priorité de 1000 , ce qui est obligatoire . La hauteur de contention du contenu est de 250 , ce qui est faible . Que se passe-t-il si nous réduisons la priorité de la contrainte de hauteur à 249 ?
Maintenant, nous pouvons voir la magie commencer à se produire. Essayons dans la sim:
Impressionnant! Étreinte du contenu réalisée. Uniquement parce que la priorité de hauteur 249 est inférieure à la priorité de contenu 250 . Fondamentalement, je dis "la hauteur que je spécifie ici est moins importante que ce que j'ai spécifié pour l'étreinte du contenu" . Ainsi, le contenu étreignant gagne.
En bout de ligne, faire en sorte que l'étiquette s'adapte au texte peut être aussi simple que de spécifier la contrainte de hauteur ou de largeur et de corriger la définition de cette priorité en association avec la contrainte de priorité de contournement du contenu de cet axe.
Je vais laisser faire l'équivalent pour la largeur comme exercice pour le lecteur!
label.sizeToFit()
dans Xcode / viewController, les contraintes étaient suffisantes. ne créait pas l'étiquette dans Playground . Jusqu'à présent, la seule façon dont je l'ai trouvé pour fonctionner dans Playground est de le fairelabel.sizeToFit()