0
votes

Réglage automatique de la hauteur pour UdititerViewCell statique ne fonctionne pas

J'ai un uableview code> et je souhaite définir la hauteur de la ligne pour trois des cellules de manière dynamique. Donc, dans ViewDidLoad () Code> J'ai implémenté le code suivant:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if indexPath.section == 0 && indexPath.row == 0 {
        return CGFloat(85)
    } else if indexPath.section == 0 && indexPath.row == 1 {
        return CGFloat(145)
    }

    return UITableView.automaticDimension 
}


4 commentaires

Pouvez-vous montrer votre code pour Cellforat ?


Je n'ai pas implémenté Cellfinorat, car la vision de la table statique est une vue détaillée et je définit l'étiquette de chaque cellule comme ceci: Labelcell1.text = DélégateObj? .Attr1, labelcell2.text = DélégateObj? .Attr2, etc.


J'ai supprimé ma réponse précédente, laissez-moi savoir si ce nouveau travaille pour vous.


Vous devez définir labelcell.numberoflines = 0 (supposer labelcell est un uilabel ). Si Labelcell est un utableviewcell , puis définissez labelcell.textlabel.numberoflines = 0 .


3 Réponses :


0
votes

La cellule de la section 3 est affichant les données de la bonne manière. Sauf si vous le dites autrement, un uilabel ne s'ajustera pas automatiquement pour répondre au texte dedans.

Ce que j'ai besoin de vous à faire est de sélectionner le uilabel en question, puis dans l'inspecteur des attributs, définissez le numéro numéro de lignes sur 0 0 . Entrez la description de l'image ici

Vous avez également dit que ce Uilabel est dynamique, ce qui signifie que vous définissez le texte quelque part dans votre code. Immédiatement après avoir défini ce texte uilabel s, vous souhaitez appeler myLabel.sizefit () . Cela devrait régler la hauteur de l'étiquette pour accueillir le texte dans.

Si cela ne fonctionne pas, j'ai une autre solution plus impliquée qui devrait fonctionner pour vous.


1 commentaires

Merci pour votre réponse! Malheureusement, ça ne marche pas pour moi ...



0
votes

parce que sizetofit () code> n'a pas fonctionné pour vous, nous allons essayer quelque chose d'un peu plus impliqué.

La cellule de la section 3 est forte> affichant les données le droit chemin. C'est parce que Uilabel code> s ne réglez pas automatiquement leur hauteur pour accueillir le texte à l'intérieur. Voici ce que vous devez faire: P>

1. Créez une contrainte de hauteur pour votre Uilabel fort> dans votre constructeur d'interface, ajoutez une contrainte pour la hauteur du Uilabel code> dans la cellule de la section 3. Connectez cette contrainte de hauteur à la classe de votre contrôleur d'affichage via un @iboutlet code>: p> xxx pré>

2. Ajouter une extension de chaîne qui calcule la hauteur forte> Je ne suis pas sûr de l'endroit où / lorsque vous définissez le texte du uilabel code> en question, mais je sais que vous le faites quelque part comme vous l'avez décrit comme étant "dynamique". Chaque fois que vous définissez le texte du Uilabel code> en question, vous devez également modifier la constante de la contrainte de hauteur que nous avons faite pour pouvoir accueillir ce texte. Nous devons donc être capables de calculer la hauteur du Uilabel code> en fonction de sa largeur et de sa police. Nous pouvons ajouter une extension code> à chaîne code> afin de le faire: p> xxx pré>

3. Définissez la constante de la contrainte de hauteur basée sur le texte de l'Uilabel fort> L'étape finale consiste à définir la hauteur de la contrainte de hauteur code> Uilabel de code> que nous avons faite en utilisant l'extension que nous venons de créer: P>

cellLabel.text = "DummyDataDummyDataDummyDataDummyDataDummyDataDummyDataDummyDataDummyData"
//This will be called immediately after you set the text for the UILabel in question
cellLabelHeight.constant = cellLabel.text.height(withConstrainedWidth: cellLabel.frame.width, font: cellLabel.font)


17 commentaires

Merci beaucoup pour vos efforts! Votre dernière suggestion semble fonctionner mieux, mais malheureusement, l'espace entre l'étiquette et le bord de la cellule est beaucoup trop petit. Mais je vais utiliser une vue texte au lieu d'une étiquette à la place ...


Vous devrez utiliser une stratégie similaire pour un uitextview . C'est-à-dire que lui donner une contrainte de hauteur, obtenir sa hauteur via uitextview.ContSeize.height , puis mettant à jour la constante de la contrainte. Donc, label vs textview ne devrait pas être trop important ici. Avez-vous une photo de la façon dont l'étiquette ressemble lors de l'utilisation de ma méthode?


Bien sûr, comment puis-je le poster sans réponse?


Avez-vous essayé de définir le (code> Numberflines comme je l'ai suggéré ci-dessus?


Il a fait. Ma réponse originale lui a demandé de définir Numberflines à 0 et appelez sizetofit () sur son uilabel @koen


Je déjoue la réponse pour que vous puissiez le voir


J'ai édité la ma question. Maintenant, il semble que la hauteur de la cellule ne changeait pas ...


Je ne pense pas sizetofit () est-il plus nécessaire, mais je pourrais avoir tort.


@finebel est Clipstobounds défini sur true pour le Uilabel ? Nous pourrions probablement obtenir ce travail s'il ne s'agit que d'un problème de contrainte.


@finebel: Qu'avez-vous changé exactement? ("Comment il s'occupe de la mise en œuvre de la suggestion ci-dessus" n'est pas très clair)


Le problème doit être que le texte Uilabel est mis à jour après la définition de la hauteur sur utableview.automaticdimension . Pouvez-vous définir des points d'arrêt tous les deux à la fois où vous définissez la constante de contrainte uilabel S et la limite retour utableview.automaticdimension ? Vous devez vous assurer que la contrainte de hauteur de l'étiquette ( celllabelheight ) modifie avant Vous appelez retour uitaire.automaticdimension .


Vous pourriez peut-être appeler utableview.reloaddata après avoir appelé CellLabelheight.ConStant = CellLabel.text.Height (withConstraïdwidth: CellLabel.frame.Width, police: CellLabel.font) ? Mais idéalement, vous mettriez à jour l'étiquette avant Vous appelez retour uitaireview.automaticdimension


Voici le projet exemple: Dropbox.com/s/le32yhlduuq7ckg/sampleProjectfe. ZIP? DL = 0 Ce serait mieux, s'il y a une solution sans le haut-kearconstraint, car je l'ai à trois cellules ...


Je vérifierai. Entre-temps, pouvez-vous définir des points d'arrêt comme indiqué dans les commentaires ci-dessus pour vous assurer que la contrainte de texte et de hauteur de l'étiquette est définie avant retour uitatifview.automaticdimension est appelé? Je suis convaincu que c'est la question. Appelant utableview.reloaddata () Après avoir défini la hauteur de la contrainte pourrait également le réparer, bien que ce soit un type de hacky.


En fait, j'ai compris, qui retourne utableview.Automaticdimension est appelée après la définition du texte de l'étiquette. Ce serait génial, si vous pouviez simplement la mettre en œuvre de la bonne manière dans l'échantillonProject! Je suis confus maintenant :-( ...


Ouais c'est ce que j'essayais de dire. Regardez les commentaires ci-dessus. Si vous appelez utableview.reloaddata () sur la ligne après CellLabelheight.ConStant = CellLabel.text.Height (withconstraïdwidth: CellLabel.frame.Width, police: CellLabel.font) , tu devrais être bon.


Génial :) heureux d'avoir pu aider