1
votes

UITableView.automaticDimension ne fonctionne pas

J'ai un problème avec une cellule prototype (qui est remplie à partir de Firebase), où la hauteur de cellule n'est pas définie correctement malgré les contraintes définies.

J'ai essayé de définir ce qui suit:

import UIKit
import Firebase


class PVVViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var PVVList = [PVVModel]()

    @IBOutlet weak var TableViewPVV: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()



        LoadDataFromPVV()

         // TableViewPVV.rowHeight = 100
        TableViewPVV.rowHeight = UITableView.automaticDimension
        TableViewPVV.estimatedRowHeight = 100

    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{

        return PVVList.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        //creating a cell using the custom class

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PVVViewControllerTableViewCell


        //the PVV object
        let PVV: PVVModel

        //getting PVV for selected position
        PVV = PVVList[indexPath.row]

        //adding values to labels
        cell.PVVData.text = PVV.BodyText

        //returning cell
        return cell  
    }


     func LoadDataFromPVV() {


        databaseReference = Database.database().reference()


        let refPVV = Database.database().reference(withPath: "PVV").queryOrdered(byChild: "Status").queryEqual(toValue: "Active")

        refPVV.observeSingleEvent(of: .value, with: { (snapshot) in

            //if the reference have some values
            if snapshot.childrenCount > 0 {

                //clearing the list
                self.PVVList.removeAll()


                //iterating through all the values
                for PVV in snapshot.children.allObjects as! [DataSnapshot] {
                    //getting values
                    let PVVObject = PVV.value as? [String: AnyObject]
                    let PVVText  = PVVObject?["BodyText"]


                    //creating PVV object with model and fetched values
                    let PVV = PVVModel(BodyText: PVVText as! String?)

                    //appending it to list
                    self.PVVList.append(PVV)
                 }

                //reloading the tableview
                self.TableViewPVV.reloadData()
            }

        })
    }
}

Cela ne fonctionne pas. Lorsque vous utilisez UITableView.automaticDimension, la hauteur de la cellule est par défaut de 44.

Cependant, si la hauteur de la cellule peut être augmentée si je règle explicitement TableViewPVV.rowHeight sur une valeur comme 100.

REMARQUE: J'ai également besoin de définir explicitement la largeur souhaitée de l'étiquette ou la valeur rowHeight spécifiée est ignorée.

REMARQUE ÉGALEMENT: J'ai les contraintes suivantes définies sur le libellé: Trailing Space to Superview = 2, Leading space = 2, Bottom space> = 2, Top Space> = 2.

Quelques captures d'écran comme suit:

Nayem: modifié pour ajouter une nouvelle image pour vous de ce à quoi ressemble le contenu sans définir la largeur souhaitée, et avec la hauteur définie à 100.

override func viewDidLoad() {
    super.viewDidLoad()

    TableViewPVV.rowHeight = UITableView.automaticDimension
    TableViewPVV.estimatedRowHeight = 100

}

J'espère pouvoir ajuster dynamiquement la hauteur de mon étiquette (PVVData) pour l'adapter au texte capturé depuis Firebase.


1 commentaires

Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été déplacée vers le chat .


3 Réponses :


1
votes

Dans la plupart des cas, c'est le problème des contraintes .... Veuillez vous assurer que votre étiquette supérieure est alignée en haut avec contenview et que votre étiquette la plus basse est alignée avec la contrainte inférieure de contentView.

voir cet exemple

 entrez la description de l'image ici


0 commentaires

0
votes

Veuillez ajouter cette méthode dans votre classe

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

Assurez-vous que l'attribut label est comme celui-ci:

 entrez la description de l'image ici p >

Et définissez la contrainte appropriée pour l'étiquette.


1 commentaires

J'ai également essayé ce qui suit (swift): func tableView (tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension} func tableView (tableView: UITableloView, estiméHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension} func tableView (tableView: UITableloView, estiméHeightForRowAtIndexPath) } Cependant, cela n'a pas fonctionné non plus. AFAIK, vous n'avez pas besoin de cette méthode si vous utilisez: TableViewPVV.rowHeight = UITableView.automaticDimension TableViewPVV.estimatedRowHeight = 100



0
votes

Essayez simplement la méthode ci-dessous:

définissez les contraintes comme indiqué dans l'image ci-dessous ( sans hauteur minimale ).

 entrez la description de l'image ici a>

définir des contraintes comme indiqué dans l'image ci-dessous ( avec une hauteur minimale ).

pour une hauteur minimale, vous avez besoin d'une contrainte de hauteur. p>

 entrez la description de l'image ici

 entrez la description de l'image ici

Définir le nombre de lignes à 0 .

 entrez la description de l'image ici

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


7 commentaires

Salut Shezad, j'ai essayé d'ajouter une contrainte de hauteur> = xx, et de définir le nombre de lignes à 0. Cependant, cela ne fonctionne pas. C'est vraiment déroutant car j'ai examiné diverses solutions pendant des jours, sans chance.


Non. Ne suggérez rien en définissant une hauteur explicite. Cela n'aidera pas à atteindre la hauteur automatique. Au lieu de cela, la hauteur sera au minimum de 40 ou une autre valeur supérieure . Que faire si les données ne remplissent qu'une seule ligne et que la taille de la cellule ne doit pas nécessairement être> = 40?


@nayem j'ai donné 40 pour un exemple, il peut donner la hauteur minimale dont il a besoin.


Non. Son exigence ne dit pas qu'il veut avoir une hauteur minimale quelle que soit la valeur de n'importe quelle cellule. Il a réellement besoin de la hauteur dynamique. Et votre solution est contradictoire avec cela.


@nayem mais la solution ci-dessus fonctionne pour une hauteur dynamique, n'est-ce pas?


Cela fonctionne en quelque sorte. Il n'est pas nécessaire d'avoir la hauteur dynamique pour travailler. Il n'est pas nécessaire de modifier la contrainte de hauteur si vous n'en avez vraiment pas besoin.


@nayem a édité la réponse avec et sans hauteur minimale