152 votes

Par Défaut changer le Comportement de Défilement de la UITableView en-Tête de Section

J'ai un UITableView avec deux sections. C'est une simple vue de la table. Je suis à l'aide de viewForHeaderInSection pour créer des vues personnalisées pour ces en-têtes. Pour l'instant, donc bon.

Par défaut le comportement de défilement est que lorsqu'une section est rencontré, la section d'en-tête reste ancré en dessous de la barre de navigation, jusqu'à la prochaine section défile dans l'affichage.

Ma question est: puis-je modifier le comportement par défaut de sorte que la section en-têtes de ne PAS rester ancré en haut, mais plutôt, faites défiler sous la barre de navigation avec le reste de la section lignes?

Ai-je raté quelque chose d'évident?

Merci.

175voto

awulf Points 1529

La façon dont j'ai résolu ce problème consiste à ajuster l' contentOffset selon la contentInset dans la UITableViewControllerDelegate (étend UIScrollViewDelegate) comme ceci:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
       CGFloat sectionHeaderHeight = 40;
   if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
       scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
   } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
       scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
   }
}

Seul problème ici c'est qu'il perd un peu de rebond lors du défilement de retour vers le haut.


{NOTE: Les "40" doit être à la hauteur exacte de VOTRE section 0 en-tête. Si vous utilisez un nombre qui est plus grand que votre section 0 en-tête de la hauteur, vous verrez que le doigt de se sentir concerné (essayer comme un "1000" et vous verrez le comportement de rebond est une sorte de bizarre sur le haut). si le numéro correspond à votre section 0 en-tête de la hauteur, le doigt se sentent semble être parfait ou presque parfait.}

86voto

voidStern Points 2582

Vous pouvez également ajouter une section avec zéro lignes du haut et utilisez simplement le pied de page de la section précédente comme un en-tête pour la prochaine.

36voto

Colin Barrett Points 3581

Ont été il me fait faire cela, j'aimerais profiter du fait que UITableViews dans le style Ordinaire ont le collant en-têtes et ceux dans le groupe de style de ne pas. Je serais probablement au moins essayer d'utiliser un tableau personnalisé de cellules pour imiter l'apparence de la Plaine de cellules Regroupés dans un tableau.

Je n'ai pas réellement essayé, de sorte qu'il peut ne pas fonctionner, mais c'est ce que je vous suggère de le faire.

28voto

LocoMike Points 1793

Je sais qu'il est en retard, mais j'ai trouvé la solution définitive!

Ce que vous voulez faire est si vous avez 10 sections, laissez la source de données de retour 20. Utiliser le même nombre pour les en-têtes de section, et les nombres impairs pour le contenu de la section. quelque chose comme ceci

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }else {
        return 5;
    }
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        return [NSString stringWithFormat:@"%i", section+1];
    }else {
        return nil;
    }
}

Voilá! :D

15voto

Neil Gall Points 319

Il y a plusieurs choses que vous devez faire pour résoudre ce problème dans un non-hacky manière:

  1. Définir la vue de table de style de UITableViewStyleGrouped
  2. Définir l'affichage de la table backgroundColor de [UIColor clearColor]
  3. Définir l' backgroundView sur chaque table vue de la cellule à une vue vide avec backgroundColor [UIColor clearColor]
  4. Si nécessaire, définissez l'affichage de la table rowHeight de façon appropriée, ou d'annuler tableView:heightForRowAtIndexPath: si les lignes ont des hauteurs différentes.

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