2 votes

Swift : Hauteur de ligne automatique pour les cellules de sous-titres

J'utilise une cellule de sous-titre dans un UITableView. J'ai défini ce qui suit dans viewDidLoad pour que la hauteur de la ligne s'étende automatiquement :

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 100

J'ai également paramétré le titre et le sous-titre de la cellule pour qu'ils soient enveloppés dans le texte :

    cell.textLabel?.numberOfLines = 0
    cell.textLabel?.lineBreakMode = .byWordWrapping

    cell.detailTextLabel?.numberOfLines = 0
    cell.detailTextLabel?.lineBreakMode = .byWordWrapping

Lorsque je tape le titre, tout va bien. Mais le sous-titre n'agrandit pas la ligne. Dois-je faire quelque chose d'autre pour que le sous-titre augmente la hauteur de la ligne ?

image

5voto

vikas prajapati Points 914

Vous devriez prendre une étiquette et donner des contraintes comme cela, enter image description here

Ensuite, écrivez ces deux méthodes déléguées de tableview.

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

Ainsi, la hauteur de la vue de la table augmente en fonction de la taille du texte de la page.

2voto

bubuxu Points 1687

En utilisant ce code de https://stackoverflow.com/a/40168001/4045472 et définir la cellule comme suit :

class MyTableViewCell: UITableViewCell {

    override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {

        self.layoutIfNeeded()
        var size = super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority)

        if let textLabel = self.textLabel, let detailTextLabel = self.detailTextLabel {
            let detailHeight = detailTextLabel.frame.size.height
            if detailTextLabel.frame.origin.x > textLabel.frame.origin.x { // style = Value1 or Value2
                let textHeight = textLabel.frame.size.height
                if (detailHeight > textHeight) {
                    size.height += detailHeight - textHeight
                }
            } else { // style = Subtitle, so always add subtitle height
                size.height += detailHeight
            }
        }

        return size

    }

}

En changeant la classe personnalisée de la cellule dans le storyboard en MyTableViewCell, la taille correcte sera définie automatiquement.

Dans la fonction tableView:cellForRow : de la source de données de la vue de tableau, après avoir défini le texte des étiquettes, appelez cell.setNeedsLayout() pour l'obliger à ajuster la mise en page.

0voto

Patrick Points 60

Vous devez définir des contraintes pour que la cellule puisse se dimensionner automatiquement en fonction de la taille de l'étiquette. Voici un tutoriel sur les cellules dynamiques. https://www.raywenderlich.com/129059/self-sizing-table-view-cells

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X