207 votes

Est-il possible de désactiver les en-têtes flottants dans UITableView avec UITableViewStylePlain ?

J'utilise un UITableView pour mettre en page le contenu des "pages". J'utilise les en-têtes de la vue tableau pour mettre en page certaines images, etc. et je préférerais qu'ils ne flottent pas, mais restent statiques, comme c'est le cas lorsque le style est défini comme suit UITableViewStyleGrouped .

Autre que l'utilisation UITableViewStyleGrouped existe-t-il un moyen de le faire ? J'aimerais éviter d'utiliser l'option groupée, car elle ajoute une marge à toutes mes cellules et nécessite la désactivation de l'affichage en arrière-plan pour chacune des cellules. J'aimerais avoir le contrôle total de ma mise en page. L'idéal serait une "UITableViewStyleBareBones", mais je n'ai pas vu cette option dans la documentation...

Merci beaucoup,

1 votes

63 votes

Utiliser le style de table UITableViewStyleGrouped - voici la réponse pour tous ceux qui cherchent à désactiver les en-têtes flottants et ne lisent pas toute la question (cela m'est arrivé...).

0 votes

@Kasztan C'est une solution de ligne zéro qui fonctionne très bien ! Merci.

0voto

siiiiiix Points 89

Le snippet affiche un sticky header uniquement pour la première section. Les autres en-têtes de section flotteront avec une cellule.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

0voto

Will Points 51

Une façon délicate est d'ajouter une section vide pour l'en-tête. Comme la section n'a pas de cellule, elle ne flottera pas du tout.

0voto

MaatheusGois Points 31

**Swift 5.3 | Programmatically **

private func buildTableView() -> UITableView {
    let tableView = UITableView()
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.rowHeight = UITableView.automaticDimension
    tableView.showsVerticalScrollIndicator = false
    tableView.separatorStyle = .none
    let dummyViewHeight: CGFloat = 80
    tableView.tableFooterView = UIView(
        frame: CGRect(x: .zero,
                      y: .zero,
                      width: tableView.bounds.size.width,
                      height: dummyViewHeight))

    tableView.contentInset = UIEdgeInsets(top: .zero, left: .zero, bottom: -dummyViewHeight, right: .zero)
    return tableView
}

0voto

Santosh Points 239

La meilleure solution pour les deux scénarios ci-dessous :

Scénario 1 : Si le style de tableView n'est pas .grouped. Je n'ai aucun problème à le changer en grouped. Le pied de page ne flottera pas.

Scénario 2 : Si vous ne voulez qu'un seul pied de page à la fin d'une tableView et que son style est .plain.

Pasos:

  1. ajouter une section supplémentaire à la fin.
  2. s'assurer que dans la section ajoutée, le nombre de lignes est nul (méthode nuberOfRowsInSection).
  3. ajouter un pied de page personnalisé à cette section.
  4. définissez heightForFooterInSection sur votre pied de page personnalisé et définissez .zero sur les pieds de page des autres sections.

exemple :

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

//Remarque : filtrez la section dans laquelle vous souhaitez ajouter une section personnalisée.

    let footerView = UIView()
    submitOrganiser?.showFooterAtTheEnd(view: footerView) //my method to customise the footer, use your implementation
    return footerView
}

0voto

MH175 Points 527

Si cela ne vous dérange pas d'utiliser un UICollectionView Dans iOS 13.0+, cela peut également être réalisé en utilisant les configurations de liste UICollectionView et en utilisant les éléments suivants headerMode réglé sur .firstItemInSection .

override func viewDidLoad() {
    super.viewDidLoad()
    var config = UICollectionLayoutListConfiguration.init(appearance: .plain)
    config.headerMode = .firstItemInSection
    let listLayout = UICollectionViewCompositionalLayout.list(using: config)
    self.collectionView.collectionViewLayout = listLayout
}

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