Comment désactiver le défilement dans le tableau UITableView lorsque le contenu tient à l'écran

240

J'ai quelques tableaux (style groupé) dans mon application iphone (uniquement sur une partie de l'écran et ajoutés avec, Interface Buildermais non sous-classés UITableViewController), dont 80% du temps sont petits et s'adapteront à l'écran. Lorsque le tableau tient sur l'écran, je voudrais désactiver le défilement, pour le rendre un peu plus propre. Mais si le tableau disparaît de l'écran (lorsque des lignes y sont ajoutées ultérieurement), j'aimerais réactiver le défilement (car sinon vous ne pouvez pas voir ce contenu.)

Y a-t-il un moyen de faire cela? Je n'arrive pas à comprendre. Je sais faire:

tableView.scrollEnabled = NO;

mais je ne sais pas où, ni si je dois calculer la taille de l'objet de la table ou quelque chose pour que cela fonctionne.


Mise à jour : voici la solution qui a finalement fonctionné pour moi:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

J'exécute ce code après avoir appelé reloadDatala table, il calcule les bonnes tailles et semble fonctionner.

table.frame.size.heightest la taille réelle de l'objet (vous pouvez le voir dans Interface Builder) affiché à l'écran, tandis que table.contentSize.heightles hauteurs de: l'en-tête, le pied de page et la hauteur de chaque cellule sont additionnées.

Ginny
la source
1
Merci. Cette solution a fonctionné pour moi. Cependant, j'ai fini par étendre UITableView et redéfinir reloadData pour désactiver scrollEnabled. La raison en est que la vue de table est chargée lorsque mon contrôleur de vue est créé. De cette façon, vous n'avez pas à appeler deux fois reloadData.
Brandon O'Rourke
@JoeBlow Je pense que vous avez manqué le point d'OP. La question n'est pas de savoir comment désactiver le rebond, mais comment activer uniquement le défilement (et le rebond, le plus probable) lorsque la vue de table doit défiler.
Kyle Clegg
Peut-être est-il préférable d'utiliser des limites, car je pense que si vous faites pivoter un peu votre tableau, frame.height va changer.
Ricardo
Il devrait y avoir: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Réponses:

396

Je pense que tu veux régler

tableView.alwaysBounceVertical = NO;
Lily Ballard
la source
6
Cela fonctionne mieux que contentSize <frame lorsque vous utilisez AutoLayout. Devrait être accepté la réponse.
Joshua Dance
1
J'utilise la mise en page automatique et cette réponse est exactement ce dont j'ai besoin.
Golden Thumb
3
mieux que de désactiver le défilement
Kirit Vaghela
5
fonctionne comme un charme, vous pouvez également le désactiver interface builderen décochant le rebond et rebondir horizontalement / verticalement.
Ahsan Ebrahim
11
pour Swift - tableView.alwaysBounceVertical = false
swiftBoy
44

Vous pouvez vérifier le nombre de cellules visibles à l'aide de cette fonction:

- (NSArray *)visibleCells

Cette méthode retournera un tableau avec les cellules qui sont visibles, vous pouvez donc compter le nombre d'objets dans ce tableau et comparer avec le nombre d'objets dans votre table .. si c'est égal .. vous pouvez désactiver le défilement en utilisant:

tableView.scrollEnabled = NO;

Comme @Ginny l'a mentionné .. nous pourrions avoir des problèmes avec les cellules partiellement visibles, donc cette solution fonctionne mieux dans ce cas:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

Si vous utilisez la mise en page automatique, cette solution fait le travail:

tableView.alwaysBounceVertical = NO.
Roberto Ferraz
la source
Je vous remercie! Cela fonctionne principalement pour moi maintenant. Le seul problème que j'ai maintenant, c'est quand les cellules sont partiellement visibles, elles comptent toujours comme visibles et donc le défilement est désactivé lorsque dans ce cas je veux qu'il soit activé.
Ginny
6
Deviner! Il s'avère que vous ne pouvez pas vraiment utiliser visibleCells, en raison du problème de cellule partiellement visible, mais cela fonctionne: if (table.contentSize.height < table.frame.size.height)>> voir modifier dans le message d'origine.
Ginny
42

Dans Swift:

tableView.alwaysBounceVertical = false
Natividad Lara Diaz
la source
18
Je vote toujours positivement pour de telles «réécritures» telles que «n̶s̶w̶e̶r̶s̶», car la conversion en syntaxe moderne demande du temps.
Dmitry Isaev
14

Il y a donc plusieurs réponses et nécessite un contenu à la fois, donc j'ajoute cette réponse:

Si vous utilisez AutoLayout, en définissant cela, cela ne devrait fonctionner que pour vous:

  • Dans du code:

tableView.alwaysBounceVertical = false

  • ou dans Interface Builder:

Il vous suffit de trouver cette option et l'option untick" Bounce Vertically".

Voici la référence:

entrez la description de l'image ici

Si vous n'utilisez pas AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }
Hemang
la source
13

essaye ça

[yourTableView setBounces:NO];
codercat
la source
@kyle - merci pour la note! - mais regardez c'est ce qui se passe automatiquement. S'il est plus court que l'écran (ou un autre support), il ne défile PAS (et évidemment ne rebondira pas, car il ne défilera même pas). S'il est plus long que l'écran, il défile (et rebondit en effet). Non??
Fattie
Peut-être que j'utilise trop les vues de collection ... peut-être que cela fonctionne comme je le décris pour les vues de collection, mais pas pour UITableView ??
Fattie
9

Vous pouvez définir activer / désactiver le rebond ou faire défiler la vue de la table en les sélectionnant / désélectionnant dans la zone Scroll View

Zone d'édition de la vue de défilement

Akila Wasala
la source
3

Vous pouvez modifier cela dans votre storyboard (si vous en utilisez un). Sous la vue du tableau, il y a une case à cocher qui dit "Défilement activé". Décochez-le et vous avez terminé.

ericmarkmartin
la source
3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;

rjobidon
la source
3
Je pense que j'ai été éclairé après avoir lu votre solution. Merci beaucoup
Arash
J'ai utilisé ceci dans ma vueDidAppear
Maria
1
Je voulais dire viewDidLayoutSubviews et non viewDidAppear
Maria
0

La hauteur par défaut est 44,0f pour une cellule tableview je crois. Vous devez avoir votre source de données en main dans un tableau? Ensuite, vérifiez simplement si cela [array count]*44.0fva au-delà des limites du cadre et si c'est le cas tableview.scrollEnabled = NO, définissez-le sur OUI. Faites-le là où vous déterminez la source de données pour cette vue de table particulière.

Bourne
la source
Mes cellules de tableau sont de tailles différentes (et peuvent changer de taille à tout moment; j'utilise la méthode heightForRowAtIndexPath), donc je ne voudrais probablement pas coder en dur 44.0f. Je crois que ce nombre est le même que tableView.rowHeight de toute façon?
Ginny
Vous feriez alors votre calcul de la hauteur totale dans cette méthode. C'est simple, non? Si cela dépasse l'écran, activez le défilement, sinon laissez-le désactivé. La méthode sera appelée pour toutes les cellules visibles. Si vous n'avez pas suffisamment de données pour dépasser l'écran, vous pouvez calculer la hauteur totale directement dans cette méthode. Continuez à ajouter à une variable globale la hauteur qu'elle renvoie à chaque appel et vous avez votre hauteur totale.
Bourne
La réponse de Roberto est un moyen plus simple de réaliser tout cela et de laisser le calcul à la table.
Bourne