J'ai une étiquette dans une cellule de vue tableau. J'ai défini le libellé sur un nombre de lignes, 2. Cependant, si le texte est plus grand, il prend de l'espace comme s'il n'avait aucune restriction de ligne et affichait le texte intégral. Même s'il n'affiche que deux lignes.
Les contraintes pour cette étiquette d'affichage sont ci-dessous. Tous les autres éléments sont de haut en bas 5 points entre le haut du conteneur et le bas. Si le texte fait 2 lignes ou moins, il n'y a pas d'espace supplémentaire. Quelqu'un a-t-il rencontré ou trouvé une solution?
5 Réponses :
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
Le problème n'est pas la hauteur de la cellule, c'est la hauteur du UILabel. J'ai maintenant les cellules à dimensionner automatiquement. Le UILabel est limité à 2 lignes, mais occupe autant de lignes qu'il en a besoin. Par exemple, un texte de 10 lignes occupera 10 lignes d'espace, puis n'affichera que deux de ces lignes au point mort au lieu de serrer ces deux lignes.
Puisque vous avez des contraintes, vous devez dire à UILabel que vous allez gérer plus d'une ligne sur votre UILabel. Vous devrez peut-être également redimensionner votre cellule / ligne tableview lorsque cela se produit afin qu'ils puissent s'adapter.
Assurez-vous que tableview s'adaptera.
let subTitleLabel: UILabel = { let label = UILabel() label.text = "My String" label.font = UIFont.systemFont(ofSize: 22).bold() label.textColor = UIColor(red: 0.773, green: 0.776, blue: 0.773, alpha: 1.0) label.numberOfLines = 0 // <---- change number of lines label.fitTextToBounds() label.translatesAutoresizingMaskIntoConstraints = false // <--- only if using constrains label.textAlignment = .left return label
Pour résoudre le problème d'UILabel p>
override func viewWillAppear(_ animated: Bool) { tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 65.0 }
Je ne veux pas que ce soit plus de 2 lignes. Je veux que ce soit 2 lignes, mais ne remplisse que l'espace d'une ligne. Il prend de la place comme s'il avait 10 lignes, alors que je le limite à 2.
@steventnorris, alors viewWillAppear résoudra cela. Mais assurez-vous que le haut d'ancrage de votre étiquette est ancré au bas de l'étiquette que vous souhaitez adapter.
Cela ne résout pas le problème. Je fais déjà cela, et les cellules se redimensionnent très bien. Le problème n'est pas la taille des cellules, c'est la taille du UILabel qui ne correspond pas correctement à son texte.
Pour mon cas, j'utilise cette fonction, si l'écran est plus petit, il le rétrécira automatiquement à la taille minimale que vous avez définie. J'espère que cela t'aides.
Si vous ne souhaitez pas que votre étiquette augmente plus que prévu.
label.setContentCompressionResistancePriority(.required, for: .vertical)
Si vous utilisez nib / storyboard. il suffit de changer la priorité de respect du contenu
en 1000
En supposant que les trois autres libellés aient numberOfLines
1.
Voici donc la solution de travail
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib.. self.tableView.delegate = self self.tableView.dataSource = self self.tableView.estimatedRowHeight = 112 self.tableView.rowHeight = UITableView.automaticDimension }
Libellé de date
Contraintes et priorité de respect du contenu
2ème libellé
Contraintes et priorité de respect du contenu
Label thing
Contraintes et étreinte du contenu Priorité
Étiqueter le dernier (12:00 AM)
Contraintes & Priorité de respect du contenu
Résultat:
Pour plus d'informations, veuillez vous référer à ce lien Projet de démonstration
J'espère que cela vous aidera. p >
Personne n'a vraiment été en mesure de me répondre. Je pense qu'il y a peut-être une extension dans une bibliothèque que j'utilise ou quelque chose qui gâche les choses. Je vais devoir aller creuser ou définir une hauteur statique, ce qui me semble insuffisant. Cela dit, ma prime expire bientôt et c'est la bonne façon de faire le truc de mise en page automatique auto-dimensionnée, donc je vais le marquer comme correct au cas où quelqu'un d'autre rencontre ce problème avec un problème plus typique qui ne l'est pas. aussi bizarre que le mien.
Merci, @steventnorris :) Votre problème est donc résolu ou rencontrez-vous toujours des problèmes?
Je suis toujours confronté à des problèmes, mais je n'ai pas encore eu l'occasion de creuser plus profondément dans les collisions d'extension potentielles qui pourraient causer cela. (base de code préexistante, donc il me manque peut-être quelque chose)
Pouvez-vous partager votre code avec moi pour que je vous aide à le résoudre rapidement?
Pas de soucis. Je l'ai trouvé. Une extension remplaçant certaines des fonctionnalités de dessin causait un problème.
Bien. c'est génial :)
vous pouvez ajouter une couleur d'arrière-plan au champ de texte pour vérifier si le champ de texte ou les contraintes posent problème. Je pense que la hauteur des champs de texte serait modifiée à une hauteur incorrecte, si vous avez deux lignes. Une solution de contournement consiste à définir des contraintes par code, mais je suis sûr qu'il doit y avoir une meilleure solution. ;)
@SeanStayn Ouais, je sais que c'est la hauteur du champ de texte qui est le problème. Si le champ de texte a une ligne, il est parfait. Si le champ de texte comporte 5 lignes, il occupe l'espace de 5 lignes mais n'en affiche que 2 alors qu'il ne devrait occuper que l'espace de 2 lignes.
avez-vous essayé d'utiliser une vue de texte à la place?
Le texte est un texte de longueur variable que je souhaite adapter à seulement deux lignes de texte @SeanStayn. Un textview ne serait pas en mesure d'accomplir cela.
Quel LineBreakMode utilisez-vous pour votre UILabel? Testez-vous toujours avec du texte comme "NameNameNameName" qui ne contient aucun espace?
Le mode de saut de ligne par défaut. Je n'ai pas changé cela, j'ai simplement augmenté les lignes à 2. En outre, j'ai testé avec du texte qui a des espaces et des non-espaces avec les mêmes résultats @MikeTaverne.
Vous pouvez essayer de tester avec différents modes de saut de ligne. Le passage à Truncate Tail au lieu de Word Wrap fait-il une différence?
@MikeTaverne Cela n'affecte rien. Joué avec certains d'entre eux déjà.
@steventnorris, il est assez difficile de comprendre ce qui s'est passé dans votre cas. Pourriez-vous l'expliquer un peu et fournir du code pour votre vue de table? Au fait, quelle est la hauteur de ligne de la vue tableau?
Pourriez-vous créer un exemple minimum, par exemple comme nouveau projet sur GitHub?
Peut-être que la priorité de contenu de votre étiquette est trop faible. Essayez de l'augmenter (par exemple 1000 juste pour le test). Peut-il y avoir un conflit avec la compression de la vue / cellule parentale?
@trungduc La hauteur de la ligne est définie automatiquement pour remplir l'espace dont elle a besoin pour le contenu. La hauteur de ligne se comporte de manière appropriée, mais le UILabel prend plus d'espace que 2 lignes. Il prend de la place comme s'il devait afficher toutes les lignes, même s'il n'en affiche que 2.
@mschmidt J'ai joué avec eux aussi sans succès. Je ne pense pas que ce soit un problème de mise en page automatique pensé tbh. C'est comme si le UILabel calculait sa hauteur en se basant sur une ligne de 0 ou comme 99, puis en affichant 2 lignes et en ne réglant pas la hauteur pour cela.
Que se passe-t-il si vous appelez
sizeToFit
sur l'étiquette après avoir défini le texte de l'étiquette?@mschmidt J'appelle déjà ça et ça n'aide pas. Quelques-unes des étiquettes n'augmentaient pas leur longueur pour s'adapter à leur texte et sizeToFit a résolu ce problème, mais pas celui-ci.
Vous pouvez utiliser le débogueur de vue pour voir si c'est vraiment à cause de l'étiquette. peut-être avez-vous une section? sans code, c'est difficile à dire.
@ugur Oui, j'ai vérifié le débogueur de vue et c'est certainement l'UILabel qui cause le problème. Aucune section. C'est une erreur étrange que je n'ai jamais vue auparavant. Me rend fou.
Un certain nombre de lignes pour les trois autres étiquettes?