Rimuovi lo spazio vuoto prima delle celle in UITableView


172

Attualmente sto provando a inserire un UITableViewin una posizione diversa anziché nella parte superiore del mio controller di visualizzazione. Detto questo, sta cercando di aggiungere l'intestazione nella parte superiore per tenere conto della barra di navigazione, ma questo non è necessario poiché non ho nella parte superiore del mio controller.

Se metto l'angolo in alto a sinistra del punto in UITableViewcui voglio che siano le celle, non inserisce le celle lì:

Ora, se muovo semplicemente la vista della tabella in modo che le celle siano nella posizione corretta, ottengo un problema diverso: le celle possono essere spostate verso l'alto durante lo scorrimento (questo è con il dito sopra il controller di navigazione):

Quando lascio andare, sì - le celle andranno proprio sotto la barra di ricerca, ma questo è ovviamente un problema su come puoi portarle sopra di essa.

Come potrei fare per fare questo? C'è un modo più semplice?

Risposte:


378

Le celle dello UITableViewspettacolo si trovano nello spazio vuoto quando scorri verso il basso?

In tal caso, il problema potrebbe essere l'inser che viene aggiunto a UITableViewcausa del controller di navigazione che hai nella tua vista. L'inserto viene aggiunto alla vista tabella in modo che il contenuto venga posizionato sotto la barra di navigazione quando non si verifica alcuno scorrimento. Quando si scorre la tabella, il contenuto scorre e viene mostrato sotto una barra di navigazione trasparente. Questo comportamento è ovviamente desiderato solo se la vista della tabella inizia direttamente sotto la barra di navigazione, che non è il caso qui.

Un'altra cosa da notare è che iOS regola l'inserzione del contenuto solo per la prima vista nella gerarchia della vista se è UIScrollViewo è discendente (ad es. UITableViewE UICollectionView). Se la gerarchia delle viste include più viste di scorrimento, automaticallyAdjustsScrollViewInsetsapporterà modifiche solo alla prima.

Ecco come modificare questo comportamento:

a) Interface Builder

  • Seleziona il controller di visualizzazione
  • Apri la finestra di controllo Attributi
  • C'è una proprietà chiamata "Regola gli inserti della vista di scorrimento" nella finestra di ispezione degli attributi IB (quando è selezionato un controller di vista) che è attivo per impostazione predefinita. Deseleziona questa opzione:


    (Immagine gentilmente concessa da Dheeraj D )

Non sono sicuro di quale versione di Xcode abbia introdotto questa opzione (non è stata individuata nelle note di rilascio), ma è almeno disponibile nella versione 5.1.1.

Modifica: per evitare confusione, questa era la terza opzione menzionata nei commenti

b) a livello di codice

Aggiungi questo al cioè viewDidLoad(crediti per Slavco Petkovski 'risposta s e Cris R ' commento s)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Questo potrebbe essere rilevante per i vecchi scolari

Puoi risolvere questo problema aggiungendo

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

O se stai usando IB e se la barra di navigazione non è trasparente (non puoi dirlo dallo screenshot)

  • Seleziona il controller di visualizzazione
  • Apri la finestra di controllo Attributi
  • Nella sezione Visualizza controller Estendi bordi deseleziona "Sotto le barre superiori"

2
Deselezionare "Under Top Bars" su UIView ha funzionato bene per me. Grazie.
Andreas Øverland,

Stavo impazzendo usando "Paging Enabled" e lo scorrimento si spostava solo dell'altezza della barra di navigazione anziché dell'intera cella. Grazie.
LordParsley

8
La terza opzione: deseleziona "Regola inserti vista di scorrimento" - ha funzionato come un fascino. grazie lekksi!
Stas Zhukovskiy,

2
self.automaticallyAdjustsScrollViewInsets = false in Swift funziona "de pelos"!
Cris R,

1
Grazie all'impostazione di UIEdgeInsetsZero è necessario se si riutilizza una tabella in un nuovo controller di tabella ogni volta che viene mostrato, altrimenti appare lo stesso spazio bianco e diventa sempre più grande.
Malhal

71

Ho avuto lo stesso problema e sono abbastanza sicuro di avere un UIView lì a un certo punto. Basta copiare l'intera vista della tabella, eliminarla e incollarla di nuovo per me.


7
questo è davvero molto strano. Questo ha risolto il problema. Qualche idea quando ciò accade?
MiQUEL,

Penso che puoi risolverlo molto più facilmente seguendo la mia risposta del 10 ottobre 13
netshark1000

Ha avuto lo stesso problema. Rimuoverlo e leggere ha funzionato anche per me.
SM

3
Per quanto ne so, gli inserti del contenuto della vista di scorrimento vengono regolati automaticamente (se automaticAdjustsScrollViewInsets = YES, che per impostazione predefinita è) solo se la vista di scorrimento è il primo figlio nella gerarchia della vista del controller di vista. La mia ipotesi è che questa soluzione funzioni perché dopo aver incollato la vista della tabella non è più la prima vista nella gerarchia della vista.
lekksi,

Quello che succede è che quando tableView è la prima cosa che aggiungi alla vista, il sistema pensa che debba lasciare spazio per la navigazione. La mia ipotesi qui è che alcune persone aggiungano tableView e quindi headerView. Dopo alcuni problemi, quindi rimuovono tableView e lo aggiungono di nuovo, quello che succede è che headerView è la prima cosa nella gerarchia, quindi il sistema non deve più adattarsi, problema risolto. Lo so perché uso solo il codice, quindi nel mio caso ho dovuto aggiungere prima l'intestazione e poi la tabella per risolverlo.
Lluis Gerard,

40

Seleziona la vista tabella nello storyboard e assicurati che lo stile sia impostato su "Semplice", anziché "Raggruppato". Puoi trovare questa impostazione nella scheda Ispettore degli attributi.


Incredibile ... questa è stata la soluzione per me stranamente ... Ho appena copiato e incollato l'intero controller di visualizzazione ma in qualche modo la tabella di questo controller di visualizzazione incollata View aveva quello strano offset. Questa risposta ha risolto il mio problema
daisura99,

Ciò ha risolto il problema, ma ora le sezioni di intestazione si comportano diversamente. Chiunque?
Bruno Muniz,

Salute. Ovunque tu sia in questo mondo. Ti benedico per sempre.
gabuchan

9

Nel mio caso avevo un UILabel sotto la UITableView nella gerarchia della vista.

L'ho spostato "in avanti" e lo spazio vuoto è apparso. Non so perché, ma funziona così, se c'è qualcosa sotto tableView, nasconde lo spazio vuoto.

Inoltre, puoi provare a selezionare / deselezionare "Regola inserti vista di scorrimento" nella finestra di ispezione del controller di visualizzazione nello storyboard.

inserisci qui la descrizione dell'immagine


2
Ho un UITableView raggruppato e deselezionando "Regola inserti di scorrimento" ha funzionato.
Matt,

5

NESSUNO di quanto sopra mi ha aiutato. ma fare questo ha aiutato :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

invece di '-64' puoi inserire qualsiasi altro numero a seconda dell'altezza della barra di navigazione.


4

Ci può essere pre-aggiunto UIRefreshControl. Ho questo problema con il codice come questo:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Come vedi, ho impostato self.refreshControllersubito dopoinit

Ma, se imposti refreshControldopo l'installazione, top-space non ti interferisce.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

Non riesco a credere che questo sia stato il vero problema. È solo un problema per me su <= 9.3.5. Come hai fatto a capirlo?
Sirene,

4

Se lo stai facendo su iOS 11, AutomaticAdjustsScrollViewInsets non funzionerà poiché è obsoleto, il seguente codice ha funzionato per me secondo la risposta in questo post: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

Spero che questo ti aiuti.



3

Non posso dirlo con certezza, ma sembra che tu abbia una UIView bloccata tra dove iniziano le celle prototipo e la parte superiore di UITableView. La mia immagine appare esattamente come la tua se rimuovi il testo / le righe che ho aggiunto.

inserisci qui la descrizione dell'immagine


3

Non sono ancora sicuro di cosa abbia causato quello spazio extra in alto, ma ho scoperto che l'eliminazione di UITableView con lo spazio e la sua sostituzione con una nuova ha portato via lo spazio.

Devo aver trascinato un UIView lì per caso, ma non ho potuto selezionarlo, quindi non ho potuto eliminare.


3

Swift 5

Prova a rimuovere tableHeaderView e tableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Controlla la cornice del tuo tavolo in storyboard o xib. Il mio di default ha un valore di posizione, quindi il bug


2

Anche nella mia applicazione ho riscontrato un problema come questo. Ho impostato l'inserzione del bordo superiore di tableView zero. Provato anche set falseper automaticallyAdjustsScrollViewInsets. Ma non ha funzionato.

Finalmente ho ottenuto una soluzione funzionante. Non lo so è questo il modo corretto. Ma implementare il heightForHeaderInSectionmetodo delegato ha funzionato per me. È necessario restituire un valore diverso da zero per funzionare in questo modo (lo zero restituito visualizzerà lo stesso spazio di prima).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

Nel 2017, ciò che funziona per me è semplicemente questa linea

navigationController? .navigationBar.isTranslucent = false

Non ho idea del perché ciò possa influenzarlo. Forse qualcuno potrebbe spiegare. Ma sono abbastanza sicuro che questa sia la risposta che la maggior parte delle persone cercherebbe.


Lo ha fatto anche per me. Grazie!
scurioni,

2

In iOS 11 e versioni successive, apple ha modificato la proprietà per regolare l'inserimento dei contenuti. Usa contentInsetAdjustmentBehaviore impostare .neverper rimuovere spazio in più sopra UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Spero che questo ti possa aiutare.


1

Bene per me il problema si è verificato quando ho trascinato una cella prototipo dal menu nella vista tabella. Quindi l'ho eliminato e ho appena impostato la cella prototipo su 1 nelle proprietà della finestra di ispezione della vista tabella


1

Lo sto facendo a livello di codice e ho semplicemente spostato il mio addSubview (tableView) in basso dopo aver aggiunto tutte le altre mie visualizzazioni secondarie e ho risolto il mio problema!

Non sono sicuro del motivo per cui questo appare solo sul dispositivo e non sul mio simulatore, ma in entrambi i casi c'è almeno una soluzione semplice!


1

Finché UITableView non è la prima sottoview del controller di visualizzazione, lo spazio vuoto non verrà visualizzato.

Soluzione: aggiungere un oggetto vista nascosta / chiara (viste, etichette, pulsante, ecc.) Come prima vista secondaria del controller di vista (allo stesso livello di UITableView ma prima di esso).


Ho trascorso così tanto tempo a cercare di capirlo, provando molti dei suggerimenti qui e su altri post. Questo è quello che l'ha risolto. Grazie! Puoi spiegare perché o pubblicare un link ad alcuni documenti che lo fanno? Sto solo imparando iOS dev ed è così diverso da Android! :)
Segna il

0

UIView può essere inserito nella parte superiore e inferiore della tabella (trascinamento della selezione). Imposta le loro proprietà come trasparenti e altezza di 1 px. Questo per rimuovere l'imbottitura extra davanti alle celle.


0

Ho avuto anche questo problema tableView non era l'ultima vista nella gerarchia. Nel mio caso avevo una vista sopra (anche se non si sovrapponevano), quindi l'ho trascinata sopra il tableView nella gerarchia e questo l'ha fatta.


0

Ho appena trovato una soluzione per questo.

Basta selezionare tableview e fare clic su Editor -> Disponi -> Invia in primo piano

Ha funzionato per me e spero che aiuti tutti voi.


0

Nel mio caso, stavo usando ContainerViewController e inserendo UITableViewController. Dopo aver rimosso ContainerViewController. I problemi scompaiono.


0

Xcode 8 bug ...

Prova prima se lo stile Storyboard UITableView è impostato su Plain.

Impostare lo stile della tabella su Raggruppato e quindi su Semplice. Ciò ha rimosso lo spazio nella mia app a capo di UITableView.


0

Nel mio caso stavo usando una vista contenitore. (Vista principale -> Vista contaner -> UITableView)

Lo spazio extra in alto, penso, è come lo spazio della barra di notifica del dispositivo (dove viene visualizzato il tempo, la batteria). Davvero, non è un presupposto.

Quello che ho fatto è stato dall'UI Builder:

  • selezionare il Controller vista tabella completo
  • Apri la finestra di controllo Attributi
  • Vai a -> Visualizza controller -> Layout -> "Seleziona schermo intero desiderato"

0

È possibile utilizzare questo codice in viewDidLoad o viewDidAppear dove viene creata la tabella:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

imposta i bordi estesi di ViewController nello storyboard in modo che la underTopBarproprietà sia deselezionata.


0

Stava avendo lo stesso problema. Ho risolto aggiungendo quanto segue a viewDidLoad.

self.extendedLayoutIncludesOpaqueBars = true


-2

controlla

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • menziona la funzione delegato tableview cellForRowAtIndexPath:
  • può gestire sia iOS 6 che 7.
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.