Eu tenho um aplicativo em que a UITableView
inserção do separador está definida como valores personalizados - Direita 0
, Esquerda 0
. Isso funciona perfeitamente iOS 7.x
, no entanto, iOS 8.0
vejo que a inserção do separador está definida como o padrão 15
à direita. Mesmo que nos arquivos xib ele tenha definido como0
, ele ainda aparece incorretamente.
Como removo as UITableViewCell
margens do separador?
ios
objective-c
swift
uitableview
ios8
user3570727
fonte
fonte
[UIColor clearColor]
e desenhar seus próprios separadores. Você é muito mais flexível assim.UITableViewCellSeparatorStyle
padrões. Até a resposta aceita é um truque muito sujo na minha opinião.Respostas:
O iOS 8.0 apresenta a propriedade layoutMargins nas células E nas visualizações de tabela.
Esta propriedade não está disponível no iOS 7.0, portanto, verifique antes de atribuí-la!
A solução fácil é subclassificar sua célula e substituir a propriedade das margens do layout, conforme sugerido por @ user3570727. No entanto, você perderá qualquer comportamento do sistema, como herdar margens da Área segura, por isso não recomendo a solução abaixo:
(Objetivo C)
(rápido 4.2):
Se você não deseja substituir a propriedade ou precisa configurá-la condicionalmente, continue lendo.
Além da
layoutMargins
propriedade, a Apple adicionou uma propriedade ao seu celular que impedirá que ela herde as configurações de margem do seu Table View. Quando essa propriedade é configurada, suas células têm permissão para configurar suas próprias margens, independentemente da exibição da tabela. Pense nisso como uma substituição.Essa propriedade é chamada
preservesSuperviewLayoutMargins
e a configuração paraNO
permitirá que alayoutMargin
configuração da célula substitua o quelayoutMargin
estiver definido no seu TableView. Isso economiza tempo ( você não precisa modificar as configurações da Visualização da tabela ) e é mais conciso. Consulte a resposta de Mike Abdullah para obter uma explicação detalhada.NOTA: o que se segue é uma implementação limpa para uma configuração de margem no nível da célula , conforme expresso na resposta de Mike Abdullah. A configuração de sua célula
preservesSuperviewLayoutMargins=NO
garantirá que a Visualização da tabela não substitua as configurações da célula. Se você realmente deseja que toda a exibição da tabela tenha margens consistentes, ajuste seu código de acordo.Configure as margens da sua célula:
Swift 4:
Definir a
preservesSuperviewLayoutMargins
propriedade em sua célula como NÃO deve impedir que a exibição da tabela substitua as margens da célula. Em alguns casos, parece não funcionar corretamente.Se tudo falhar, você pode forçar com força suas margens do Table View:
Swift 4:
... e lá vai você! Isso deve funcionar no iOS 7 e 8.
EDIT: Mohamed Saleh me chamou a atenção para uma possível alteração no iOS 9. Você pode precisar definir as Table View
cellLayoutMarginsFollowReadableWidth
comoNO
se você deseja personalizar inserções ou margens. Sua milhagem pode variar, isso não está muito bem documentado.Esta propriedade existe apenas no iOS 9, portanto, verifique antes de configurar.
Swift 4:
(o código acima da inserção 0 do separador UITableView do iOS 8 não está funcionando )
EDIT: Aqui está uma abordagem pura do Interface Builder:
OBSERVAÇÃO: o iOS 11 muda e simplifica muito desse comportamento, uma atualização será lançada ...
fonte
cell.preservesSuperviewLayoutMargins = NO
a sugestão de @ bffmike ou depois de rolar as maneiras pelas quais as inserções apareceriam. (wtf ??)cell.preservesSuperviewLayoutMargins
no meu método de fonte de dados:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Arg !!! Depois de brincar, faça isso na sua
Cell
subclasse:ou definindo o
cell.layoutMargins = UIEdgeInsetsZero;
fixo para mim.fonte
separatorInset
no IB não funcionou. também há um problema com as cores de fundo da exibição de tabela. isso é coisa realmente doentia.Vamos tirar um momento para entender o problema antes de carregar cegamente para tentar corrigi-lo.
Uma rápida olhada no depurador lhe dirá que as linhas separadoras são subvisões de
UITableViewCell
. Parece que a própria célula assume uma grande quantidade de responsabilidade pelo layout dessas linhas.O iOS 8 apresenta o conceito de margens de layout . Por padrão, as margens do layout de uma vista são
8pt
de todos os lados e são herdadas das visualizações de ancestral.O melhor que podemos dizer é que, ao estabelecer sua linha separadora,
UITableViewCell
escolhe respeitar a margem do layout esquerdo, usando-a para restringir a inserção esquerda.Juntando tudo isso, para alcançar a inserção desejada de zero, precisamos:
0
Em outras palavras, é uma tarefa bem simples de se conseguir:
Coisas a serem observadas:
preservesSuperviewLayoutMargins
se desejado.preservesSuperviewLayoutMargins
, você pode configurar as visualizações de ancestrais (como a tabela) para terem0
margem esquerda também, mas isso parece inerentemente mais propenso a erros, pois você não controla toda a hierarquia.0
e deixar as outras.UITableView
desenham na parte inferior das tabelas de estilo simples, acho que será necessário especificar também as mesmas configurações no nível da tabela (ainda não tentei essa!)fonte
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
layoutMargins
quantopreservesSuperviewLayoutMargins
na célula. Qualquer outra coisa parece confiar no vodu.separatorInset
de aUITableViewCell
no iOS 8, você deve definir o conjuntoUIEdgeInsets
como zero noUITableView
e noUITableViewCell
. Se você não fizer as duas coisas, ainda terá uma inserção esquerda maior que zero. Eu confirmei isso várias vezes.Acredito que esta seja a mesma pergunta que fiz aqui: Remover SeparatorInset no iOS 8 UITableView for XCode 6 iPhone Simulator
No iOS 8 , há uma nova propriedade para todos os objetos herdados
UIView
. Portanto, a solução para definir oSeparatorInset
iOS 7.x não poderá remover o espaço em branco que você vê no UITableView no iOS 8.A nova propriedade é chamada " layoutMargins ".
A solução:-
Se você definir
cell.layoutMargins = UIEdgeInsetsZero;
sem verificar selayoutMargins
existe, o aplicativo falhará no iOS 7.x. Portanto, a melhor maneira seria verificar se olayoutMargins
primeiro existe antessetLayoutMargins:UIEdgeInsetsZero
.fonte
Você pode usar UIAppearance uma vez, na inicialização do aplicativo (antes do carregamento da interface do usuário), para defini-lo como configurações globais padrão:
Dessa forma, você mantém o código do seu UIViewController limpo e sempre pode substituí-lo, se desejar.
fonte
O iOS introduz a propriedade layoutMargins nas células E nas visualizações de tabela.
Esta propriedade não está disponível no iOS 7.0, portanto, verifique antes de atribuí-la!
No entanto, a Apple adicionou uma propriedade chamada preservesSuperviewLayoutMargins ao seu celular que impedirá que ele 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 da tabela. Pense nisso como uma substituição.
Essa propriedade é chamada preservesSuperviewLayoutMargins , e defini-la como NO pode permitir que você substitua as configurações layoutMargin da Table View pela configuração layoutMargin da sua própria célula. Isso economiza tempo ( você não precisa modificar as configurações da Visualização da tabela ) e é mais conciso. Consulte a resposta de Mike Abdullah para obter uma explicação detalhada.
NOTA: esta é a implementação apropriada e menos confusa, conforme expresso na resposta de Mike Abdullah; definir preserves da sua célulaSuperviewLayoutMargins = NO garantirá que a exibição da tabela não substitua as configurações da célula.
Primeiro passo - Configure as margens da sua célula:
Definir a propriedade preservesSuperviewLayoutMargins em sua célula como NO deve impedir que a exibição da tabela substitua as margens da célula. Em alguns casos, parece não funcionar corretamente.
Segunda etapa - Somente se tudo falhar, você poderá forçar com força suas margens do Table View:
... e lá vai você! Isso deve funcionar no iOS 8 e no iOS 7.
Nota: testado usando o iOS 8.1 e 7.1, no meu caso, eu só precisava usar o primeiro passo desta explicação.
A segunda etapa é necessária apenas se você tiver uma célula despovoada abaixo das células renderizadas, ou seja. se a tabela for maior que o número de linhas no modelo de tabela. Não seguir o segundo passo resultaria em diferentes deslocamentos do separador.
fonte
willDisplayCell
método, pois o próprio método já é iOS 8+ e nunca será chamado a partir de versões mais antigas.No Swift, é um pouco mais irritante porque
layoutMargins
é uma propriedade, então você deve substituir o getter e o setter.Isso fará efetivamente
layoutMargins
somente leitura, o que, no meu caso, está bem.fonte
Para o iOS 9, você precisa adicionar:
Para mais detalhes, consulte a pergunta .
fonte
Eu só queria compartilhar uma extensão que fiz para remover as margens dos separadores de células do tableview.
Usado no contexto:
fonte
Rápido:
fonte
Eu fiz o trabalho fazendo o seguinte:
fonte
Quanto ao que o cdstamper sugeriu em vez da exibição da tabela, adicionar linhas abaixo no método layoutSubview da célula funciona para mim.
fonte
Exemplo do Swift 3.0:
fonte
Depois de muita investigação ...
Aqui está a única maneira de controlar totalmente essas coisas (que eu poderia encontrar)
Controlar totalmente as inserções do separador e as margens do layout em cada célula. Faça isso no
willDisplayCell
método em seuUITableviewDelegate
.O objeto de célula controla o separador e
contentView
controla todo o resto. Se os espaços inseridos do separador estiverem aparecendo em uma cor inesperada, isso deve resolver:fonte
Solução simples no Swift para iOS 8 com uma personalização
UITableViewCell
Dessa maneira, você está definindo
layoutMargin
eseparatorInset
apenas uma vez, em vez de fazê-lo para cada um,willDisplayCell
como sugere a maioria das respostas acima.Se você estiver usando um costume,
UITableViewCell
este é o local correto para fazê-lo. Caso contrário, você deve fazê-lotableView:cellForRowAtIndexPath
.Apenas mais uma dica: você não precisa definir
preservesSuperviewLayoutMargins = false
porque o valor padrão já estáNO
!fonte
Para mim, a linha simples fez o trabalho
fonte
Basta adicionar o código abaixo para resolver este programa.
Boa sorte para você!
fonte
Lukasz responde em Swift:
fonte
Este é o código que está funcionando para mim, no Swift:
Isso me parece mais limpo (por enquanto), já que todos os ajustes de borda / margem de cell / tableView são feitos no
tableView:willDisplayCell:forRowAtIndexPath:
método, sem sobrecarregar o código desnecessáriotableView:cellForRowAtIndexPath:
.Btw, estou apenas configurando o separatorInset / layoutMargins à esquerda da célula, porque nesse caso não quero estragar minhas restrições que configurei na minha célula.
Código atualizado para Swift 2.2:
fonte
A maioria das respostas estão mostrando inserções de separação e as margens de layout a ser definido através de uma variedade de métodos (ou seja,
viewDidLayoutSubviews
,willDisplayCell
, etc) para as células e tableviews, mas eu descobri que apenas colocá-los emcellForRowAtIndexPath
obras grandes. Parece o caminho mais limpo.fonte
Use o trecho de código abaixo para evitar problemas indesejados de preenchimento para o UITableView no IOS 8 e 7.
fonte
Em vez de atualizar
preservesSuperviewLayoutMargins
elayoutMargins
sempre que a célula rolar (usandowillDisplayCell
), sugiro fazer isso uma vez emcellForRowAtIndexPath:
:fonte
Aqui está uma maneira fácil de remover globalmente a inserção.
Em
UITableViewCell+Extensions.swift
:Em
AppDelegate
application:didFinishLaunchingWithOptions:
:Você pode pensar em a) também substituir
separatorInset
a extensão ou b) definir o proxy de aparência paralayoutMargins
. Nem vai funcionar. Mesmo queseparatorInset
seja indicado como uma propriedade, tentar substituí-lo como uma propriedade (ou método) gera erros de compilador. E definindo o proxy aparência deUITableViewCell
'slayoutMargins
(ou, para essa matéria, também definindo os proxies aparência deUITableView
' slayoutMargins
eseparatorInset
) não tem efeito.fonte
No iOS8:
Adicionando isso à minha subclasse UITableViewCell:
e isso para "tableView: cellForRowAtIndexPath" ou "tableView: willDisplayCell":
Trabalhou para mim.
fonte
Para qualquer célula específica que você deseja ocultar o separador.
fonte
Depois de ter visto as respostas no terceiro andar, tentei descobrir qual era a relação de configurar o separador entre o TableView e o TableViewCell e fiz alguns testes. Aqui estão as minhas conclusões:
podemos considerar que definir o separador da célula como zero deve mover o separador em duas etapas: o primeiro passo é definir o separador da célula como zero. O segundo passo é definir o marginlayout da célula como zero.
defina o conjunto separador do TableView e o marginlayout pode afetar o conjunto separador da célula . No entanto, a partir do teste, acho que o conjunto separador do TableView parece inútil, o marginlayout do TableView pode realmente afetar o marginginout da célula .
set PreservesSuperviewLayoutMargins = false da célula pode cortar o efeito de margem do TableView nas células.
uma das soluções:
fonte
Esta é a minha solução. Isso se aplica à subclasse de célula customizada, basta adicioná-los à subclasse.
2)
E é conveniente que você possa personalizar a posição do separador sem solicitar ao designer que desenhe um para você ..........
fonte
De uma forma mais compacta do que a resposta mais votada ...
}
fonte
Adicionando este trecho, simples e elegante no Swift funciona para mim no iOS8 :)
fonte
Isso funcionou perfeitamente para mim no iOS 8 e iOS 9.
Para OBJ-C
fonte