Existe uma maneira de fazer com que as células UITableView no iOS 7 não tenham uma quebra de linha no separador?

Percebi que no iOS 7, o UITableViewCells tem uma quebra de linha no separador da célula que o iOS 6 não possui. Existe uma maneira de se livrar dessa quebra de linha? Alterar o separador para none e, em seguida, fazer UIViews com a cor do separador ainda faz com que o separador branco ocorra independentemente.

Para iOS7:

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

Para iOS8:

Primeiro configure sua exibição de tabela da seguinte maneira:

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

Em seguida, no seu método cellForRowAtIndexPath:, configure a célula da seguinte maneira:

 if ([cell respondsToSelector:@selector(layoutMargins)]) { cell.layoutMargins = UIEdgeInsetsZero; } 

Nota: Inclua layoutMargins e separatorInset para suportar as duas versões do iOS

Você também pode definir o ‘ Separator Inset ‘ do storyboard:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Se você deseja oferecer suporte a versões mais antigas do iOS, verifique a disponibilidade desse método antes de chamá-lo:

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

Descobri isso.

 [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 

A resposta selecionada não funcionou para mim. Mas isso sim e funciona a partir do ios 2.0:

  [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 

Versão rápida

O iOS apresenta a propriedade layoutMargins nas células e visualizações de tabela.

Esta propriedade não está disponível no iOS 7.0, então você precisa verificar antes de atribuí-la!

No entanto, a Apple adicionou uma ** propriedade ao seu celular que impedirá que ela herde as configurações de margem do seu Table View. Dessa forma, suas células podem configurar suas próprias margens independentemente da exibição de tabela. Pense nisso como um substituto.

Essa propriedade é denominada preservesSuperviewLayoutMargins e a configuração como NO permite replace as configurações layoutMargin da Visualização da Tabela pela configuração layoutMargin da sua própria célula. Isso economiza tempo ( você não precisa modificar as configurações da Table View ), e é mais conciso. Por favor, consulte a resposta de Mike Abdullah para uma explicação detalhada.

NOTA: esta é a implementação adequada, menos confusa, conforme expressa na resposta de Mike Abdullah; definindo preserves do seu celularSuperviewLayoutMargins = NO irá garantir que sua exibição de tabela não substitua as configurações de célula.

Primeiro passo – Configure as margens do seu celular:

 /* Tells the delegate the table view is about to draw a cell for a particular row. */ override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { // Remove seperator inset if cell.respondsToSelector("setSeparatorInset:") { cell.separatorInset = UIEdgeInsetsZero } // Prevent the cell from inheriting the Table View's margin settings if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") { cell.preservesSuperviewLayoutMargins = false } // Explictly set your cell's layout margins if cell.respondsToSelector("setLayoutMargins:") { cell.layoutMargins = UIEdgeInsetsZero } } 

Definir a propriedade preservesSuperviewLayoutMargins no seu celular como NO deve impedir que sua exibição de tabela substitua as margens do seu celular. Em alguns casos, parece não funcionar corretamente.

Segundo passo – Somente se tudo falhar, você pode forçar brutalmente as margens do Table View:

 /* Called to notify the view controller that its view has just laid out its subviews. */ override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Force your tableview margins (this may be a bad idea) if self.tableView.respondsToSelector("setSeparatorInset:") { self.tableView.separatorInset = UIEdgeInsetsZero } if self.tableView.respondsToSelector("setLayoutMargins:") { self.tableView.layoutMargins = UIEdgeInsetsZero } } 

… e lá vai você! Isso deve funcionar no iOS 8 e no iOS 7.

Nota: testado usando iOS 8.1 e 7.1, no meu caso eu só precisava usar o primeiro passo desta explicação.

O Segundo Passo só é necessário se você tiver uma célula não preenchida abaixo das células renderizadas, isto é. se a tabela for maior que o número de linhas no modelo de tabela. Não fazer o segundo passo resultaria em diferentes deslocamentos do separador.

Para uma solução permanente em todo o aplicativo, chame isso em application: didFinishLaunching .. qualquer tableview será “fixa”

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero]; } 

E no iOS 8, baseado no post do Seth McFarlane aqui , você precisa começar a lidar com o layoutMargins. O seguinte fez isso por mim:

  1. Em ApplicationDidFinishLaunching, execute o seguinte:

     if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) { [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero]; } 
  2. Crie a seguinte categoria no UITableView:

     @interface UITableView(WJAdditions) -(void) wjZeroSeparatorInset; @end @implementation UITableView (WJAdditions) -(void) wjZeroSeparatorInset { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 if ([self respondsToSelector:@selector(setLayoutMargins:)]) { self.layoutMargins = UIEdgeInsetsZero; } #endif #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if ([self respondsToSelector: @selector(setSeparatorInset:)]) self.separatorInset = UIEdgeInsetsZero; } #endif } @end 
  3. Em seus UITableViews, logo após a boot, chame

     [self wjZeroSeparatorInset]; 
  4. Nos seus UITableViewControllers, você precisa do seguinte:

     -(void) viewWillLayoutSubviews { [super viewWillLayoutSubviews]; UITableView* tv = self.tableView; if ([tv respondsToSelector:@selector(setLayoutMargins:)]) { [tv setLayoutMargins:UIEdgeInsetsZero]; } } 

No iOS 8, parece haver um pequeno bug. O valor personalizado para inserção de separador não é aplicado às células com texto. Eu tentei defini-lo a partir do construtor de interface e através do código, mas não funcionou. Eu arquivei um relatório de bug também.

insira a descrição da imagem aqui

Enquanto isso, tenho uma pequena solução para isso. Eu simplesmente desenho a linha na célula. Crie uma subclass de UITableViewCell e substitua o método drawRect . Também não se esqueça de definir a propriedade do separador do UITableView como None. Aqui está o código. Está no Swift mas desde que é basicamente C, você pode usar a mesma coisa em Objective-C também.

 override func drawRect(rect: CGRect) { super.drawRect(rect) let context = UIGraphicsGetCurrentContext() CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color CGContextSetLineWidth(context, 2) // separator width CGContextMoveToPoint(context, 0, self.bounds.size.height) CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height) CGContextStrokePath(context) } 

Redefinir separatorInset corrige esse problema para mim:

 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:self.tableView.separatorInset]; } 

A solução:

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

Cuidado ao definir o separatorInset de tableView para UIEdgeInsetsZero parece quebrar a margem esquerda dos títulos das seções ao mesmo tempo! (pelo menos no iOS 7.1)

Se você deseja exibir títulos de seção com tableView: titleForHeaderInSection: e ainda obter o efeito de desejo de sem quebra de linha entre UITableViewCells, você deve definir o separatorInset diretamente nas células em vez do tableView!

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // ... [cell setSeparatorInset:UIEdgeInsetsZero]; 

Para iOS8 + isso funcionou para mim

 tableView.layoutMargins = UIEdgeInsetsZero 

e no método cellForRowAtIndexPath :

 cell.layoutMargins = UIEdgeInsetsZero; 
 - (void)viewDidLoad { [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; [super viewDidLoad]; // Additional setup } 

Nota: a linha setSeparatorStyle deve estar acima da super chamada.

 @implementation UITableView (HGApperance) -(void)setSeparatorXMargin:(CGFloat)margin{ // iOS 7 if ([self respondsToSelector:@selector(setSeparatorInset:)]) { [self setSeparatorInset:UIEdgeInsetsZero]; } if ([self respondsToSelector:@selector(layoutMargins)]) { self.layoutMargins = UIEdgeInsetsZero; } } @end 

Para TableviewCell, a resposta de Willam funciona perfeitamente.

Para iOS8 e acima

Se você achar que todas as soluções não funcionam como eu, acho que você pode ter usado a subclass de UITableViewCell e replace o método layoutSubviews , se você atender a duas condições, continue lendo.

Faça ou verifique passo a passo.

1 、 Após alocar e iniciar o UITableView , defina sua propriedade layoutMargins .

 if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { _tableView.layoutMargins = UIEdgeInsetsZero ; } 

2 、 No método - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath , depois de - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath e - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath seu UITableViewCell personalizado, defina sua propriedade layoutMargins .

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

3 、 A parte mais importante vem dentro Se você replace o - (void)layoutSubviews método de UITableViewCell, não se esqueça de chamar seu super .

 - (void)layoutSubviews { [super layoutSubviews] ; // layout the subviews } 

Xamarin.iOS Version

Eu estendi o separador UITableView para toda a largura do Xamarin.iOS no iOS 8.4 com a ajuda de posts de Luis E. Prado e King-Wizard . Eu tive que definir SeparatorInset e LayoutMargins para fazê-lo funcionar. Não gravei cheques para versões inferiores do iOS, pois estou segmentando o iOS 8 e superior.

Eu escrevi os dois methods de extensão C # a seguir para definir a largura total do separador UITableView no nível UITableView ou UITableViewCell. Você pode usar um ou ambos os methods, dependendo do efeito desejado (veja as explicações abaixo).

UITableView

Defina as propriedades do UITableView para alterar os separadores que aparecem após as células vazias. Esse método SetLayoutMarginsZero poderia ser chamado pelo método ViewDidLoad do ViewController.

 public static void SetLayoutMarginsZero(this UITableView tableView) { tableView.SeparatorInset = UIEdgeInsets.Zero; tableView.LayoutMargins = UIEdgeInsets.Zero; } 

UITableViewCell

Defina as propriedades do UITableViewCell para alterar os separadores que aparecem após as células preenchidas. Esse método SetLayoutMarginsZero pode ser chamado pelo método TableContSource GetCell.

 public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell) { tableViewCell.SeparatorInset = UIEdgeInsets.Zero; tableViewCell.LayoutMargins = UIEdgeInsets.Zero; tableViewCell.PreservesSuperviewLayoutMargins = false; }