Come disabilitare lo scorrimento nella tabella UITableView quando il contenuto si adatta allo schermo


240

Ho alcune tabelle (raggruppate in stile) nella mia app per iPhone (solo su una parte dello schermo e aggiunte con Interface Builder, ma non sottoclasse UITableViewController) che l'80% delle volte sono piccole e si adattano allo schermo. Quando il tavolo si adatta allo schermo, mi piacerebbe disabilitare lo scorrimento, per renderlo un po 'più pulito. Ma se la tabella esce dallo schermo (quando le righe vengono successivamente aggiunte ad essa), vorrei abilitare nuovamente lo scorrimento (perché altrimenti non puoi vedere quel contenuto.)

C'è un modo per fare questo? Non riesco a capirlo. So di fare:

tableView.scrollEnabled = NO;

ma non sono sicuro di dove, o se devo calcolare la dimensione dell'oggetto tabella o qualcosa per farlo funzionare.


Aggiornamento : ecco la soluzione che finalmente ha funzionato per me:

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

Eseguo questo codice dopo aver chiamato reloadDatasul tavolo, calcola le giuste dimensioni e sembra funzionare.

table.frame.size.heightè la dimensione effettiva dell'oggetto (lo puoi vedere in Interface Builder) visualizzata sullo schermo, mentre table.contentSize.heightle altezze di: intestazione, piè di pagina e altezza di ogni cella sommate.


1
Grazie. Quella soluzione ha funzionato per me. Tuttavia, ho finito per estendere UITableView e sovrascrivere reloadData per disabilitare scrollEnabled. Il motivo è che la vista tabella viene caricata quando viene creato il mio controller di visualizzazione. In questo modo non è necessario chiamare due volte reloadData.
Brandon O'Rourke,

@JoeBlow Penso che ti sia sfuggito il punto di OP. La domanda non è come disabilitare il rimbalzo, è come abilitare lo scorrimento (e il rimbalzo, molto probabilmente) quando è necessario scorrere la vista tabella.
Kyle Clegg,

Forse è meglio usare i limiti, perché penso che se ruoti un po 'il tavolo, frame.height cambierà.
Ricardo,

Ci dovrebbe essere: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Risposte:


396

Penso che tu voglia impostare

tableView.alwaysBounceVertical = NO;

6
Funziona meglio di contentSize <frame quando si utilizza AutoLayout. Dovrebbe essere accettata la risposta.
Joshua Dance,

1
Sto usando il layout automatico e questa risposta è esattamente ciò di cui ho bisogno.
Pollice d'oro,

3
meglio che disabilitare lo scorrimento
Kirit Vaghela,

5
funziona come un incantesimo, puoi anche disabilitarlo interface builderdeselezionando rimbalzo e rimbalzo in senso orizzontale / verticale.
Ahsan Ebrahim,

11
per Swift - tableView.alwaysBounceVertical = false
swiftBoy

44

Puoi verificare il numero di celle visibili usando questa funzione:

- (NSArray *)visibleCells

Questo metodo restituirà un array con le celle che sono visibili, quindi puoi contare il numero di oggetti in questo array e confrontarlo con il numero di oggetti nella tua tabella .. se è uguale .. puoi disabilitare lo scorrimento usando:

tableView.scrollEnabled = NO;

Come accennato da @Ginny .. potremmo avere problemi con celle parzialmente visibili, quindi questa soluzione funziona meglio in questo caso:

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

Nel caso in cui tu stia utilizzando AutoLayout questa soluzione fa il lavoro:

tableView.alwaysBounceVertical = NO.

Grazie! Questo funziona principalmente per me adesso. L'unico problema che sto riscontrando ora è quando le celle sono parzialmente visibili contano ancora come visibili e quindi lo scorrimento viene disabilitato quando in quel caso voglio che sia abilitato.
Ginny,

6
Capito! Si scopre che non puoi davvero usare visibleCells, a causa del problema della cella parzialmente visibile, ma questo funziona: if (table.contentSize.height < table.frame.size.height)>> vedi modifica nel post originale.
Ginny,

42

In Swift:

tableView.alwaysBounceVertical = false

18
Ho sempre votato a tali "riscritture" a̶n̶s̶w̶e̶r̶s̶ perché la conversione alla sintassi moderna richiede tempo.
Dmitry Isaev il

14

Quindi ci sono più risposte e richiede tutti i contenuti contemporaneamente, quindi sto aggiungendo questa risposta:

Se stai usando AutoLayout, impostando questo dovrebbe funzionare solo per te:

  • Nel codice:

tableView.alwaysBounceVertical = false

  • o In Interface Builder:

Basta trovare questa opzione e l'opzione untick" Bounce Vertically".

Ecco il riferimento:

inserisci qui la descrizione dell'immagine

Se non stai usando AutoLayout:

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

13

prova questo

[yourTableView setBounces:NO];

@kyle - grazie per la nota! - ma guarda è quello che succede automaticamente. Se è più corto dello schermo (o di un altro supporto), NON scorre (e ovviamente non rimbalzerà, perché non scorrerà nemmeno). Se è più lungo dello schermo, scorrerà (e rimbalzerà). No??
Fattie,

Forse sto usando troppo le viste di raccolta ... forse funziona come descrivo per le viste di raccolta, ma non per UITableView ??
Fattie,

9

È possibile impostare abilitare / disabilitare il rimbalzo o lo scorrimento della vista tabella selezionando / deselezionandoli nell'area Vista di scorrimento

Scorri Visualizza l'area di modifica


3

Puoi modificarlo nello storyboard (se ne usi uno). Sotto la vista tabella c'è una casella che dice "Scorrimento abilitato". Deselezionalo e il gioco è fatto.


3

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


3
Penso di essere stato illuminato dopo aver letto la tua soluzione. Mille grazie
Arash,

L'ho usato a mio avvisoDidAppear
Maria

1
Intendevo viewDidLayoutSubviews non viewDidAppear
Maria

0

L'altezza predefinita è 44,0f per una cella di visualizzazione tabella credo. Devi avere l'origine dati in mano in un array? Quindi controlla se [array count]*44.0fva oltre i limiti del frame e, se impostato tableview.scrollEnabled = NO, altrimenti imposta su YES. Fallo dove trovi l'origine dati per quella particolare vista tabella.


Le celle della mia tabella hanno dimensioni diverse (e possono cambiare dimensione in qualsiasi momento; sto usando il metodo heightForRowAtIndexPath), quindi probabilmente non vorrei hardcode 44.0f. Credo che il numero sia lo stesso di tableView.rowHeight comunque?
Ginny,

In questo modo eseguiresti il ​​calcolo dell'altezza totale. Semplice vero? Se questo supera il limite dello schermo, abilita lo scorrimento, altrimenti lascialo disabilitato. Il metodo verrebbe chiamato per tutte le celle visibili. Se non disponi di dati sufficienti per superare lo schermo, puoi calcolare l'altezza totale proprio in quel metodo. Continua ad aggiungere a una variabile globale l'altezza che restituisce ad ogni chiamata e hai la tua altezza totale.
Bourne,

La risposta di Roberto è un modo più semplice per raggiungere tutto ciò e lasciare il calcolo alla tabella.
Bourne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.