web-dev-qa-db-fra.com

Cellule d'affichage de tableau à dimensionnement automatique dans Xcode 9

J'ai un UITableViewController où la cellule s'auto-dimensionne correctement en utilisant Xcode 8 et Swift 3. Maintenant que j'utilise Xcode 9 et = Swift 4, ils ne se développent pas et utilisent simplement la hauteur par défaut de 44.

(J'ai environ une phrase ou deux dans chaque UITableViewCell)

J'utilisais cela avant:

// MARK: - Table view delegate

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

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

... mais a pu le commenter parce que par Mise à jour de votre application pour iOS 11 a dit que la valeur par défaut serait auto-dimensionnée maintenant:

enter image description here

J'ai essayé de jouer avec la modification de la cible de déploiement en iOS 11, en jouant dans Storyboard (mais j'utilise un style de vue de cellule de base, donc il n'y a pas beaucoup de mise en page automatique à faire), et je ne peux pas comprendre ce que qui se passe.

J'ai le titre UILabel défini sur 0 lignes et le retour à la ligne Word Wrap, mais je n'arrive toujours pas à obtenir la cellule à développer en fonction du contenu du texte à l'intérieur de celui-ci dans Xcode 9. Des idées?

Merci!

Modifier:

Voici les options (que je n'ai pas) pour l'épinglage car il s'agit d'une cellule de base:

enter image description here

enter image description here

enter image description here

21
SRMR

J'ai eu le même problème et l'ai résolu avec des lignes de code:

class MyTableViewController: UITableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()

    tableView.estimatedRowHeight = UITableViewAutomaticDimension
    tableView.rowHeight = UITableViewAutomaticDimension
  }

C'est peut-être un bug dans Xcode.

Mise à jour

Nouveau dans Xcode 9 beta 3:

Interface Builder prend désormais en charge la définition de la valeur estimée de RowHeight de UITableView. Cela permet de dimensionner automatiquement les cellules du tableau en définissant la hauteur estimée sur une valeur autre que zéro, et est activé par défaut. (17995201)

19
Micha C.

J'ai eu le même problème de vue de table cassée. La correction n'était qu'un clic.

Accédez à vos scènes xib ou storyboard avec des vues de table, accédez à l'inspecteur de taille, et vous verrez les hauteurs de vue de table (même sur les vues de table dynamiques) à 44, et les sections seront à 22. Cliquez simplement sur "automatique" et boum, il se présentera comme prévu.

enter image description here

Notez que je spécifie également les éléments suivants dans viewDidLoad de la sous-classe UITableViewController (layoutSubviews résout les problèmes avec le premier chargement d'un tableViewController ne se positionnant pas correctement par rapport à une barre de navigation non translucide).

   self.tableView.estimatedRowHeight = 180;
   self.tableView.rowHeight = UITableViewAutomaticDimension;
   self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  [self.tableView layoutSubviews];
16
Mike Critchley

J'ai le même problème et j'ai lu à ce sujet dans de nombreuses documentations, une réponse satisfaisante était quelque chose comme ceci, vous devez vérifier les deux options afin d'obtenir la bonne hauteur, car une hauteur estimée est nécessaire pour la configuration initiale de l'interface utilisateur comme les barres de défilement et d'autres choses de ce genre .

Fournir une estimation non négative de la hauteur des lignes peut améliorer les performances de chargement de la vue de table. Si la table contient des lignes à hauteur variable, il peut être coûteux de calculer toutes leurs hauteurs lors du chargement de la table. L'utilisation de l'estimation vous permet de reporter une partie du coût du calcul de la géométrie du temps de chargement au temps de défilement. Lorsque vous créez une cellule de vue de tableau à dimensionnement automatique, vous devez définir cette propriété et utiliser des contraintes pour définir la taille de la cellule. La valeur par défaut est 0, ce qui signifie qu'il n'y a pas d'estimation. (Documentation Apple)>

voir cette image pour le storyboard

Notez également qu'il y a un bogue dans xCode 9, lorsque vous essayez d'appliquer le chargement paresseux dans le calcul automatique de la hauteur, il défilera de manière inattendue, donc je vous recommanderai d'utiliser la méthode par programmation à cet égard.

self.postTableView.estimatedRowHeight = 200;
self.postTableView.rowHeight = UITableViewAutomaticDimension;

quelque chose comme ça. Merci!

1
Najam
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var tblview: UITableView!

    var selectindex = -1

    var arrnumber  = ["1","2","3","4","5"]

    var image = ["index.jpg","rose-blue-flower-rose-blooms-67636.jpeg","index.jpg","rose-blue-flower-rose-blooms-67636.jpeg","index.jpg"]


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


    }


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

        return arrnumber.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tblview.dequeueReusableCell(withIdentifier: "cell", for: indexPath)as! ExpandableTableViewCell


        cell.lblnumber.text = arrnumber[indexPath.row]

        cell.img.image = UIImage(named: image[indexPath.row] as! String)

        return cell


    }

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

        if (selectindex == indexPath.row)
        {
            return 250
        }
        else{
            return 60
        }

    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if(selectindex == indexPath.row)
        {
            selectindex = -1
        }else{
            selectindex = indexPath.row
        }

        self.tblview.beginUpdates()
        self.tblview.endUpdates()

    }

}
1
hiren

En plus de

tableView.estimatedRowHeight = UITableViewAutomaticDimension
tableView.rowHeight = UITableViewAutomaticDimension

vous devez définir une contrainte de hauteur pour le contentView du tabeleViewCell.

class CustomTableViewCell: UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        let height: CGFloat = 200
        heightAnchor.constraint(equalToConstant: height).isActive = true
    }
}
1
Lindemann

Pour moi, la zone de sécurité a été vérifiée. Décocher "Zone sûre" a fait le travail pour moi.

"Safe Area"

1
sRoy