Come impostare l'intera larghezza del separatore in UITableView


149

Ho un punto in UITableViewcui i separatori non hanno l'intera larghezza. Termina come 10 pixel prima del lato sinistro. Stavo giocando con questo codice nel viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Anche nello storyboard quando è possibile selezionare selettori personalizzati o predefiniti. Ora tutte le celle popolate non hanno i selettori a larghezza intera ma le celle vuote hanno larghezza intera.

Come posso risolvere questo problema?


9
UITableViewha una proprietà separatorInset. Impostare l'inserzione del UITableViewseparatore di linea su zero. Inoltre puoi cambiare lo separatorInsetdallo storyboard
KRUKUSA il

Risposte:


220

Questo ha funzionato per me sui dispositivi iOS 8.4 - 9.0 usando Xcode 6.4 e Swift 1.2:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Aggiornamento Swift 5:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

Perché questo rimuove il mio tavolo con uno vuoto? I separatori vengono spostati ma non riesco a vedere nessuno dei miei pulsanti
Oscar

1
@ James potresti spiegarmi "rimuovi il mio tavolo con uno vuoto?". Come hai aggiunto i tuoi pulsanti (tramite IB, codice)?
MB_iOSSviluppatore

1
Soluzione molto bella. Ma nel mio caso ho messo il codice direttamente sull'inizializzazione della cella, perché volevo avere l'intera larghezza del separatore in tutti i controller.
Vojta,

Nel caso in cui non sia ovvio, questo funziona anche con Objective-C con le opportune modifiche alla sintassi ovviamente.
Cohenadair,

1
Nessuna di queste soluzioni funziona su un iPad. Funziona solo su un iPhone ...
Charles Robertson,

103

Ho ricevuto la risposta da questo post: iOS 8 UITableView separator inset 0 non funziona

Aggiungi questo codice sul tuo UITableViewController

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}

2
funziona per me aggiungendo solo il metodo delegato tableView
TonyTony,

Mi dispiace non aver sottotitolato. Vuoi dire che ti è bastato aggiungere TableViewDeleagte ?. Ho appena provato ad aggiungere che non ha funzionato per me @TonyTony
Timo Cengiz,

3
per me il metodo viewDidLayoutSubviewsnon è necessario
TonyTony,

Hai provato a eseguire il codice con altre versioni IOS diverse da 8? Forse funziona per i più recenti. Altrimenti fa bene che funzioni. Ho provato ad aggiungere il metodo delegato tableview e non mi è stato di aiuto. @TonyTony
Timo Cengiz,

Ho dovuto usare entrambi. Ho provato a usarli singolarmente senza successo. Ha funzionato solo quando ho usato entrambi. Inoltre, l'ho provato quando il mio controller di visualizzazione era una sottoclasse di UITableViewController e quando era una sottoclasse di UIViewController. Nessuna differenza. Nota che sto correndo nel simulatore 8.1.
Ron,

100

Nel tuo UITableViewCell

Vai su Attributi Inspector nel tuo Interface Builder e modifica semplicemente "15" in 0. Fallo per tutte le celle che desideri modificare.

instets

Potrebbe essere necessario aggiungere [cell setLayoutMargins:UIEdgeInsetsZero];al tuotableViewCell


1
O è strano. Questo ha funzionato per me (grazie!) Sulle righe in cui avevo UITableViewCells da visualizzare, ma su tutte le righe vuote sotto di esse, il separatore era ancora rientrato di 15 pixel.
Mike Gledhill,

Se stai usando celle statiche, tutto ciò che ti serve è cambiare l'inserto sinistro su 0 come descritto nell'immagine (Lavorare in iOS 10, Xcode 8.3.1)
Ignacio Valdivieso

29

per Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

21
  1. Seleziona il tuo UITableViewCell
  2. Vai a Ispettore degli attributi
  3. Vai a Separatore e modificalo in "Inserti personalizzati"
  4. Set lefte / o rightcampi. (Per impostazione predefinita left: 15, right: 0)

Guarda come funziona (usando left: 100):

inserisci qui la descrizione dell'immagine

Risultato:

inserisci qui la descrizione dell'immagine


1
duplicato della precedente risposta di @Hannah Louisa Carney
Konstantin Salavatov

19

Eredito da UITableViewControllere necessario aggiunta alle impostazioni di due inserti willDisplayCellanche per impostare preservesSuperviewLayoutMarginssu false. In Swift si presenta così:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

Non è necessario impostare preservesSuperviewLayoutMargins = falseperché il valore predefinito è già falso
crubio

2
Si noti che ciò non regolerà i separatori sulle celle "segnaposto" visualizzate dal controller per riempire la vista sotto le celle se le celle non compongono l'intera altezza.
Tieme,

11

Il separatore Insetè di default 15 da sinistra. Cambia l' Insetopzione Separatore da autoa custome imposta l'inserto su 0.

inserisci qui la descrizione dell'immagine


9

Per Swift in iOS 9+

Se si utilizza un'abitudine UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

quindi per il tuo UITableViewin viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

Questa è l'unica risposta che l'ha risolto per me (aggiornato a Swift 3). Tuttavia ... funziona quando ci sono dati nella cella. Per le celle vuote che non sono state ancora riempite (e immagino non abbia chiamato questa variabile layoutMargins sostituita) il separatore continua a non riempire l'intera larghezza della mia cella personalizzata nella vista tabella. Qualche idea su questo?
RanLearns,

Su iPhone, il separatore termina a pochi pixel da sinistra e pochi pixel da destra su celle vuote. Va bene senza usare questo trucco per azzerare i margini. Sull'iPad c'è il vero problema: i separatori su una cella vuota vanno dal bordo sinistro della vista tabella, solo circa l'80% della larghezza della cella. Quando ci sono dati nella cella, il separatore rappresenta ancora l'80% della larghezza della cella, ma inizia il 20% del passaggio e arriva fino al bordo destro della vista tabella
RanLearns

1
Ho trovato una soluzione ... usando if #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} lo ha fatto, quindi non ho bisogno del tuo codice su iPhone. Il separatore si estende su tutta la larghezza. Su iPad, le celle vuote hanno un separatore a larghezza intera, ma ho bisogno del tuo codice per mantenere la larghezza completa quando vengono aggiunti i dati. Altrimenti, ci sono alcuni pixel a sinistra aggiunti dove non c'è un separatore una volta che i dati riempiono la cella.
RanLearns,

1
Risposta dove ho ottenuto il codice nel commento di cui sopra da: stackoverflow.com/a/31538250/428981
RanLearns

9

Per le persone che hanno problemi con l'iPad, questo ti porterà allo stesso modo dell'iPhone. È quindi possibile regolare il separatorInsetcome necessario.

tableView.cellLayoutMarginsFollowReadableWidth = false

Questo era il mio problema su iOS 10 vs iOS 11. iOS 11 andava bene, ma 10 aveva margini diversi. Grazie!!!
migs647,

9

Usalo nel cellForRowAtIndexPathmetodo, per configurare le specifiche del separatore di cella,
funziona perfettamente per iOS9.0 +

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;

8

Testato per iOS 9.3 e Swift 2.2. Assicurati di inserire il codice nel willDisplayCellquale viene chiamato appena prima di visualizzare la cella e non nel cellForRowAtIndexPathpunto in cui crei solo la cella.

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

Inserisci override alla funzione per UITableViewController, in questo modo:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

Nessuna delle precedenti ha funzionato per me in Swift 2.2 e Xcode 7.3.1

Si è rivelata la soluzione più semplice di tutte. Nessun codice necessario Modifica i TableViewCellvalori dei Margini layout nel tuo UITableViewispettore:


4

Per Swift 3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

In viewDidLoad(testato iOS11 - swift 4.1)

provare

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

Nessuna di queste soluzioni funziona su iPad, ma ho trovato una soluzione che copre entrambi i dispositivi:

Con celle riutilizzabili:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

Con celle non riutilizzabili:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Solo per espandere questo approccio:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Entrambe le proprietà possono essere utilizzate da UITableView& UITableViewCell. Quest'ultimo è, infatti, una proprietà di UIView, che è una classe genitore di entrambi UITableView& UITableViewCell.


1
L'unica soluzione praticabile che ho trovato per le celle non riutilizzabili
Topolino

0

swift 5, Xcode 11 Update

posizionalo all'interno di viewDidLoad ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

per il separatore da bordo a bordo basta impostare il valore di sinistra e destra su 0.

a proposito, modifica "yourTableView" con il nome del punto vendita TableView.

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.