1
votes

UILabel dans UITableViewCell prend de l'espace supplémentaire lorsqu'il est défini sur un nombre fixe de lignes

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?

 entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici


18 commentaires

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?


5 Réponses :


0
votes
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }

1 commentaires

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.



0
votes

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
} 


3 commentaires

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.



0
votes

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.

Taille de police minimale


0 commentaires

1
votes

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


0 commentaires

1
votes

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

Date Label

2ème libellé

Contraintes et priorité de respect du contenu

 2nd Label

Label thing

Contraintes et étreinte du contenu Priorité

 Label Thing

Étiqueter le dernier (12:00 AM)

Contraintes & Priorité de respect du contenu

 Time label

Résultat:

 Result in iPhone X

Pour plus d'informations, veuillez vous référer à ce lien Projet de démonstration

J'espère que cela vous aidera. p >


6 commentaires

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 :)