Elimina i separatori extra sotto UITableView


714

Quando imposto una vista tabella con 4 righe, ci sono ancora linee di separatori extra (o celle vuote extra) sotto le righe riempite.

Come rimuoverei queste celle?

immagine per ulteriori linee di separazione in UITableView

Risposte:


1505

Interface builder (iOS 9+)

Basta trascinare un UIView sul tavolo. Nello storyboard, siederà nella parte superiore sotto le celle personalizzate. Puoi preferire chiamarlo "piè di pagina".

Qui è mostrato in verde per chiarezza, probabilmente vorresti un colore chiaro.

Notando che regolando l'altezza, puoi influenzare come viene gestito il "rimbalzo inferiore" della tabella, come preferisci. (L'altezza zero di solito va bene).

inserisci qui la descrizione dell'immagine


Per farlo programmaticamente:

veloce

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

Objective-C

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

o se preferisci,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Storicamente in iOS:

Aggiungi al controller della vista tabella ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

e se necessario ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}

Penso che le tue descrizioni e il tuo codice siano invertiti. Comunque, ha funzionato alla grande per me. Uso solo piè di pagina "reali" con tabelle raggruppate, quindi ho aggiunto if (tableView.style! = UITableViewStyleGrouped) {} ​​attorno al tuo codice. Ora tutte le mie tabelle non raggruppate perdono le celle extra, mentre le mie tabelle raggruppate non sono interessate.
arlomedia,

Seguendo la mia nota sopra, aggiungerò un avviso che, se si inseriscono condizioni nel metodo viewForFooterInSection, assicurarsi che il metodo restituisca un UIView o zero. Se ritorni per errore, la tua app andrà in crash!
arlomedia,

4
@Mathieu Funzionerà perché se la tabella ha un piè di pagina personalizzato non creerà righe "fantom" per riempire la vista tabella. Quindi in te creerai una vista vuota da usare come piè di pagina e imposterai l'altezza vicino a 0 (non potrebbe essere zero o iOS non lo renderà). Con questo semplice trucco cambierai il comportamento predefinito.
J. Costa,

2
@ j.Costa: la tua soluzione funzionerà solo una volta durante la creazione di uitableview. dopo aver fatto clic sull'ultima cella la soluzione non è più valida. per favore, migliora la tua risposta.

3
L'uso tableFooterViewlascia un separatore sull'ultima cella della riga, poiché la tabella anticipa ancora il contenuto sotto quella cella. L'uso del modo storico eliminerà l'ultimo separatore e avrà un aspetto complessivamente migliore.
James Kuang,

128

Ecco un altro modo per farlo senza lo stile di tabella raggruppata, e probabilmente non lo indovineresti. L'aggiunta di un'intestazione e piè di pagina alla tabella (forse l'uno o l'altro è sufficiente, non è stata verificata) fa scomparire i separatori dalle righe di riempimento / vuote.

Mi sono imbattuto in questo perché volevo un po 'di spazio nella parte superiore e inferiore dei tavoli per ridurre il rischio di colpire i pulsanti invece di una cella della tabella con dita carnose. Ecco un metodo per inserire una vista vuota come intestazione e piè di pagina. Usa l'altezza che preferisci, eliminando comunque le linee di separazione extra.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

In risposta a @Casebash, sono tornato al codice nella mia app (Gestore elenchi "AcmeLists" nell'iTunes store ...) e ho messo in corto circuito il metodo addHeaderAndFooter per verificare. Senza di essa , ho i separatori di riga extra; con il codice, ho quello che vedi in questa finestra snap: nessuna immagine di separatori di righe di tabella . Quindi non sono sicuro del motivo per cui non avrebbe funzionato per te. Inoltre, per me ha senso che avere un piè di pagina personalizzato in una vista tabella debba necessariamente smettere di disegnare i separatori di riga per le righe vuote sottostanti. Sarebbe orribile. Per riferimento, ho esaminato le tabelle in cui c'erano più righe di quelle che potevano essere visualizzate sullo schermo, e quindi per una tabella con due righe. In entrambi i casi, nessun separatore estraneo.

Forse le tue visualizzazioni personalizzate non sono state effettivamente aggiunte. Per verificarlo, imposta il colore di sfondo su qualcosa di diverso da clearColor, ad esempio [UIColor redColor]. Se non vedi alcune barre rosse nella parte inferiore del tavolo, il piè di pagina non è stato impostato.


1
Puoi farlo anche in IB. Basta trascinare un UIView nella parte inferiore del TableView e impostare l'altezza su 1.
Ortwin Gentz,

70

Rimozione di linee di separazione extra per le righe vuote in UITableView in Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}

34

Vorrei estendere la risposta di wkw :

Aggiungere semplicemente il piè di pagina con altezza 0 farà il trucco. (testato su sdk 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

o ancora più semplice: dove hai impostato la visualizzazione della tabella, aggiungi questa riga:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

o anche più semplice - per rimuovere semplicemente tutti i separatori:

[_tableView setTableFooterView:[UIView new]];

Grazie a WKW ancora :)


Questa è la risposta giusta, perché in altri metodi l'ultima riga rimane senza separatore di riga
Ankush

22

Per iOS 7+ usando Storyboard

Trascina semplicemente a UIViewnel tuo UITableViewpiè di pagina. Imposta l'altezza della vista piè di pagina su 0.


18

Prova questo. Ha funzionato per me:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}

14

Per Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }

11

Se si utilizza Swift, aggiungere il codice seguente per viewDidLoad del controller che gestisce la vista tabella:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}

8

Puoi semplicemente aggiungere un piè di pagina vuoto alla fine, quindi nasconderà le celle vuote ma sembrerà anche abbastanza brutto:

tableView.tableFooterView = UIView()

inserisci qui la descrizione dell'immagine

C'è un approccio migliore: aggiungi una linea di 1 punto alla fine della vista della tabella come piè di pagina e anche le celle vuote non verranno più mostrate.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

inserisci qui la descrizione dell'immagine


Input molto bello, tuttavia non è necessario creare l'ultima cella con uno spesso colore di separazione nella parte inferiore, invece basta renderla dello stesso colore di sfondo della cella e scompare.
Gustavo Baiocchi Costa,

Comunque preferisci. Ma penso che il tipo di separatore "non completato" sembri piuttosto brutto.
Darko,

7

aggiungi questo codice ( Swift ). .

tableView.tableFooterView = UIView()

1
Duplica di molte risposte, tra cui la risposta wiki principale e la risposta Sebastian
Cœur

7

Avanzamento della soluzione di J. Costa: è possibile apportare una modifica globale alla tabella inserendo questa riga di codice:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

all'interno del primo metodo possibile (di solito in AppDelegate, in: application:didFinishLaunchingWithOptions:metodo).


2
Fai attenzione con questo, ci sono casi in cui il tuo piè di pagina previsto può essere ignorato e passerai un giorno o due a mettere in discussione la tua sanità mentale. Inoltre, tableFooterView non è contrassegnato con UI_APPEARANCE_SELECTOR, pertanto il comportamento effettivo potrebbe cambiare in qualsiasi momento.
mwright,

6

So che questa domanda è stata accettata come risposta, ma ho messo qui diversi modi per nascondere la linea di separazione extra di UITableView.

Puoi nascondere tableViewla linea di separazione standard e aggiungere la tua linea personalizzata nella parte superiore di ogni cella.

Aggiornare:

Il modo più semplice per aggiungere un separatore personalizzato è aggiungere UIViewun'altezza semplice di 1px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

O

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

O

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

OPPURE Il modo migliore e semplice che mi piace di sempre è

self.tableView.tableFooterView = [[UIView alloc] init];

Provane uno qualsiasi;


6

Puoi trovare molte risposte a questa domanda. La maggior parte di loro intorno manipolazione con UITableView's tableFooterViewattributo e questo è il modo corretto per nascondere le righe vuote. Per comodità ho creato una semplice estensione che consente di attivare / disattivare le righe vuote da Interface Builder. Puoi verificarlo da questo file gist . Spero che possa farti risparmiare un po 'del tuo tempo.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Uso:

tableView.isEmptyRowsHidden = true

inserisci qui la descrizione dell'immagine


5

uitableview extra separator line nascondi extra separators lines hide in swift 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)

5

Se non si desidera alcun separatore dopo l'ultima cella, è necessario un'altezza vicina allo zero ma diversa da zero per il piè di pagina.

Nel tuo UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
superba! Ha funzionato per me !!
Antony Raphel,


3

Aggiungi una vista con il colore del separatore desiderato come colore di sfondo, larghezza 100%, altezza 1px nella posizione x0 y-1 sul tuo tavolo ViewCell. Assicurati che tableViewCell non tagli le sottoview, invece dovrebbe tableView.

Quindi ottieni un separatore assolutamente semplice e funzionante solo tra celle esistenti senza alcun hack per codice o IB.

Nota: su un rimbalzo superiore verticale viene visualizzato il primo separatore, ma questo non dovrebbe essere un problema perché è il comportamento predefinito di iOS.


3

Stavo usando una vista tabella per mostrare un numero fisso di righe ad altezza fissa, quindi l'ho semplicemente ridimensionato e reso non scorrevole.


3

Per eliminare le righe di separazione extra dalla parte inferiore di UItableview a livello di codice, basta scrivere seguendo due righe di codice e rimuoverà la separazione extra da essa.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Questo trucco funziona sempre con me, provaci.


2

Ho avuto la fortuna di implementare un singolo pezzo della risposta accettata (iOS 9+, Swift 2.2). Avevo provato a implementare:

self.tableView.tableFooterView = UIView(frame: .zero)

Tuttavia, non tableViewho avuto alcun effetto sul mio - credo che potrebbe avere qualcosa a che fare con il fatto che stavo usando UITableViewController.

Invece, ho dovuto solo sostituire il viewForFooterInSectionmetodo (non ho impostato tableFooterViewaltrove):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Questo ha funzionato bene per un tableViewcon una singola sezione (se hai più sezioni, devi specificare l'ultima).


2

Se hai solo una sezione, il modo più rapido e semplice è impostare lo stile di visualizzazione tabella da "Semplice" a "Raggruppato". (vedi immagine)

TableView raggruppato

Se hai più sezioni, potresti dover impostare l'altezza dell'intestazione su zero (a seconda del gusto del tuo / del tuo cliente / del tuo project manager)

Se hai più sezioni e non vuoi scherzare con le intestazioni (anche se è solo una riga nel caso più semplice), devi impostare un UIView come piè di pagina, come spiegato nelle risposte precedenti)


2

Estensione Swift 4.0

Solo una piccola estensione per lo storyboard:

inserisci qui la descrizione dell'immagine

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}

2

Swift a 4 vie semplice e veloce.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Se hai celle statiche. Puoi anche disattivare il separatore dalla finestra di ispezione. (questo non sarà desiderabile se hai bisogno del separatore. In tal caso usa il metodo mostrato sopra) finestra dell'ispettore


L'impostazione di una nuova UIView su tableFooterView ha già ricevuto una risposta 10 volte, con spiegazioni migliori sul perché, un codice migliore (che ti manca super.viewDidLoad()) ed è incluso nella risposta wiki in alto. Per quanto riguarda la rimozione di tutti i separatori, non è proprio questa la domanda, quindi è meglio ripristinare l'ultima modifica e / o eliminare completamente la risposta.
Cœur,

1

Se si desidera rimuovere lo spazio indesiderato in UITableview è possibile utilizzare due metodi di seguito

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}

1

Ho aggiunto questa piccola estensione tableview che aiuta in tutto

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}

1

Prova con questo

per l' obiettivo C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

per Swift

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}

0

Prova questo

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];

0

UIKitnon crea una cella vuota quando tableViewha un tableFooterView. Quindi possiamo fare un trucco e assegnare un UIViewoggetto di altezza zero come piè di pagina tableView.

tableView.tableFooterView = UIView()

0

Nel caso in cui si dispone di un searchbarnel vostro view(per limitare il numero di risultati per esempio), si deve aggiungere anche il testo seguente shouldReloadTableForSearchStringeshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];

0

In Swift (sto usando 4.0), puoi farlo creando una UITableViewCellclasse personalizzata e overridingil setSelectedmetodo. Quindi il separator insetstutto a 0 . (la mia classe principale con la vista tabella ha uno sfondo chiaro) colore.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
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.