Como definir a largura total do separador no UITableView

149

Eu tenho um UITableViewonde os separadores não têm toda a largura. Termina 10 pixels antes do lado esquerdo. Eu estava brincando com esse código no viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Também no storyboard, quando você pode selecionar seletores personalizados ou padrão. Agora, todas as células preenchidas não possuem seletores de largura total, mas as células vazias têm largura total.

Como posso consertar isso?

Timo Cengiz
fonte
9
UITableViewtem uma propriedade separatorInset. Defina a inserção do UITableViewseparador de linha como zero. Além disso, você pode alterar o separatorInsetdo storyboard
KRUKUSA

Respostas:

220

Isso funcionou para mim nos dispositivos iOS 8.4 - 9.0 usando o Xcode 6.4 e o 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
}

Atualização do Swift 5:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
MB_iOSDeveloper
fonte
Por que isso remove minha mesa com uma em branco? Os separadores são movidos mas eu não posso ver qualquer um dos meus botões
Oscar
1
@ James, você poderia explicar "remover minha mesa com uma em branco?". Como você adicionou seus botões (via código IB)?
MB_iOSDeveloper
1
Solução muito boa. Mas no meu caso, coloquei o código diretamente na inicialização da célula, porque queria ter largura total do separador em todos os controladores.
Vojta
Caso não seja óbvio, isso também funciona para o Objective-C, com as devidas alterações de sintaxe.
cohenadair
1
Nenhuma dessas soluções funciona em um iPad. Isso só funciona em um iPhone ...
Charles Robertson
103

Eu recebi a resposta deste post: iOS 8 UITableView separator inset 0 not working

Basta adicionar este código no seu 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];
    }
}
Timo Cengiz
fonte
2
ele trabalha para mim para adicionar apenas o método tableView delegado
TonyTony
Me desculpe, eu não entendi. Você quer dizer que basta adicionar o TableViewDeleagte ?. Eu apenas tentei acrescentar que não funcionou para mim @TonyTony
Timo Cengiz
3
para mim o método viewDidLayoutSubviewsnão é necessário
TonyTony
Você tenta executar seu código com outras versões do IOS diferentes de 8? Talvez funcione para os mais novos. Caso contrário, é bom para você que ele funcione. Tentei apenas adicionar o método delegado tableview e não ajudou. @TonyTony
Timo Cengiz
Eu tive que usar os dois. Eu tentei usar cada um individualmente, sem sucesso. Só funcionou quando usei os dois. Além disso, tentei quando meu controlador de exibição era uma subclasse de UITableViewController e quando era uma subclasse de UIViewController. Não faz diferença. Observe que estou executando no simulador 8.1.
877 Ron
100

Na tua UITableViewCell

Vá para o Attributes Inspector no Interface Builder e simplesmente altere "15" para 0. Faça isso para todas as células que deseja alterar.

instets

Pode ser necessário adicionar [cell setLayoutMargins:UIEdgeInsetsZero];ao seutableViewCell

HannahCarney
fonte
1
Ou isso é estranho. Isso funcionou para mim (obrigado!) Nas linhas onde eu tinha UITableViewCells para serem exibidas, mas em todas as linhas vazias abaixo delas, o separador ainda era recuado por 15 pixels.
Mike Gledhill
Se você estiver usando células estáticas, tudo que você precisa é mudar a inserção esquerda para 0 como descrito na imagem (Working no iOS 10, Xcode 8.3.1)
Ignacio Valdivieso
29

para Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}
Wilson
fonte
20
  1. Selecione seu UITableViewCell
  2. Ir para o Inspetor de Atributos
  3. Vá para o separador e mude para "Insets personalizados"
  4. Conjunto lefte / ou rightcampos. (Por padrão left: 15, right: 0)

Veja como funciona (usando left: 100):

insira a descrição da imagem aqui

Resultado:

insira a descrição da imagem aqui

Sebastián Lara
fonte
1
duplicada da resposta anterior de @Hannah Louisa Carney
Konstantin Salavatov
19

Eu herdo UITableViewControllere necessário adicional às configurações de duas inserções willDisplayCelltambém para definir preservesSuperviewLayoutMarginscomo false. No Swift, fica assim:

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
    }
}
H6
fonte
Você não precisa conjunto preservesSuperviewLayoutMargins = falseporque o valor padrão já é falsa
crubio
2
Observe que isso não ajustará os separadores nas células 'espaço reservado' exibidas pelo controlador para preencher a exibição abaixo das células, se as células não atingirem a altura total.
Oct
11

O separador Inseté por padrão 15 da esquerda. Altere a Insetopção Separador de autopara custome defina a inserção como 0.

insira a descrição da imagem aqui

Ramin
fonte
9

Para Swift no iOS 9 ou superior

Se estiver usando um costume UITableViewCell:

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

então para o seu UITableViewem viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;
Christopher Larsen
fonte
Esta é a única resposta que a corrigiu para mim (atualizada para a rápida 3). No entanto ... funciona quando há dados na célula. Para células em branco que ainda não foram preenchidas (e acho que não chamaram essa variável layoutMargins substituída), o separador ainda não preenche toda a largura da minha célula personalizada na visualização de tabela. Alguma idéia sobre isso?
RanLearns
No iPhone, o separador termina apenas alguns pixels da esquerda e alguns pixels da direita nas células vazias. Parece bom sem usar esse truque para zerar as margens. No iPad, o problema é real - os separadores em uma célula vazia vão da borda esquerda da visualização da tabela, apenas cerca de 80% da largura da célula. Quando há dados na célula, o separador ainda está com 80% da largura da célula, mas inicia 20% do caminho e segue até a borda direita da visualização da tabela
RanLearns
1
Descobri uma solução ... usando if #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} a criou para que eu não precise do seu código no iPhone. O separador tem apenas a largura total. No iPad, as células vazias têm um separador de largura total, mas eu preciso do seu código para manter a largura total quando os dados são adicionados. Caso contrário, haverá alguns pixels à esquerda adicionados, onde não haverá separador quando os dados preencherem a célula.
RanLearns
1
Resposta de onde obtive o código no comentário acima em: stackoverflow.com/a/31538250/428981
RanLearns
9

Para pessoas com problemas com o iPad - isso o levará a um estado igual ao iPhone. Você pode ajustar o separatorInsetconforme necessário.

tableView.cellLayoutMarginsFollowReadableWidth = false
Michael Rose
fonte
Esse foi o meu problema no iOS 10 x iOS 11. O iOS 11 estava bom, mas 10 tinham margens diferentes. Obrigado!!!
precisa saber é o seguinte
9

Use-o no cellForRowAtIndexPathmétodo, para configurar as especificações do separador de célula,
ele funciona perfeitamente para iOS9.0 +

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;
Aks
fonte
8

Testado para iOS 9.3 e Swift 2.2. Certifique-se de inserir o código no willDisplayCellqual é chamado imediatamente antes de exibir a célula e não cellForRowAtIndexPathonde você cria apenas a célula.

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

Adicione overrideà função para UITableViewController, da seguinte maneira:

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

Nenhuma das opções acima funcionou para mim no Swift 2.2 e no Xcode 7.3.1

Acabou sendo a solução mais simples de todas. Nenhum código é necessário. Basta alterar os TableViewCellvalores das margens do layout no seu UITableViewinspetor:

aurawindsurfing
fonte
4

Para o 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
    }
}
Giulio Colleluori
fonte
1

No viewDidLoad (iOS11 testado - swift 4.1)

experimentar

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

Giang
fonte
0

Nenhuma dessas soluções funciona no iPad, mas eu criei uma solução que abrange os dois dispositivos:

Com células reutilizáveis:

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

Com células não reutilizáveis:

- (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];
}

Apenas para expandir essa abordagem:

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

Ambas as propriedades podem ser usadas por UITableView& UITableViewCell. Este último é, de fato, uma propriedade de UIView, que é uma classe pai de ambos UITableView& UITableViewCell.

Charles Robertson
fonte
1
A única solução viável I encontrado para células não reutilizáveis
Mickey
0

swift 5, Xcode 11 Atualizar

coloque isso dentro de viewDidLoad ()

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

para separador de ponta a ponta, defina o valor de esquerda e direita como 0.

a propósito, altere "yourTableView" para o nome do seu tableView Outlet.

Developersian
fonte