Eu tenho algum problema estranho UITableView
apenas no iOS 7.
UITableViewCellSeparator
desaparece acima da primeira linha e abaixo da última linha. Às vezes, depois de selecionar as linhas ou algumas ações de rolagem, ela aparece.
No meu caso tableView
é carregado do Storyboard
com UITableViewStylePlain
estilo. O problema certamente não está presente UITableViewCellSeparatorStyle
, o que não é alterado do padrão UITableViewCellSeparatorStyleSingleLine
.
Como li nos Fóruns de desenvolvimento da Apple ( aqui e aqui ), outras pessoas têm esse problema e algumas soluções alternativas são encontradas, por exemplo:
Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.
Mas ainda estou procurando a razão de um comportamento estranho desse separador.
Alguma ideia?
Atualização: Como eu vi no XCode 5.1 DP e no iOS 7.1 beta, a Apple tentou corrigir esse problema. Agora, o separador é mostrado conforme necessário algumas vezes abaixo da última linha, após alguma atualização, mas não após a criação da visualização da tabela.
Respostas:
Despejei a hierarquia de subvisão das células afetadas e constatei que ela
_UITableViewCellSeparatorView
estava oculta. Não é de admirar que não seja mostrado!Substituí
layoutSubviews
minhaUITableViewCell
subclasse e agora os separadores são exibidos de forma confiável:Objetivo-C :
Swift :
As outras soluções propostas aqui não funcionaram consistentemente para mim ou parecem desajeitadas (adicionando visualizações personalizadas de rodapé de 1 px).
fonte
Isso funcionou para mim:
fonte
Eu também tive o problema com o separador ausente e descobri que o problema só ocorria quando
heightForRowAtIndexPath
estava retornando um número decimal . Solução:fonte
Você tentou adicionar uma UIView de altura 1 no cabeçalho e no rodapé da tabela com a cor de fundo cinza claro? Basicamente, ele zombará do primeiro e do último separador.
fonte
@samvermette
Corrigi o problema usando esses métodos de delegação. Agora não pisca:
fonte
Encontramos esse problema em nosso aplicativo. Quando o usuário selecionou uma célula, uma nova visualização de tabela foi colocada na pilha do controlador de navegação e, quando o usuário a abriu, o separador estava ausente. Resolvemos isso colocando
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
nodidSelectRowAtIndexPath
método delegado de exibição de tabela.fonte
self.tableView.allowsMultipleSelection = NO;
?Aqui está uma solução mais fácil (embora um pouco bagunçada), se você precisar de uma, tente selecionar e desmarcar a célula depois que os dados forem recarregados e a animação padrão estiver concluída.
basta adicionar:
fonte
Descobri que a solução mais fácil é, após recarregar uma célula, também recarregar a célula acima:
fonte
Uma solução simples e limpa que funciona no iOS 8 e iOS 9 (beta 1)
Aqui está uma solução simples, limpa e não intrusiva. Envolve chamar um método de categoria que irá corrigir os separadores.
Tudo o que você precisa fazer é percorrer a hierarquia da célula e ocultar o separador. Como isso:
O que eu recomendo é adicionar isso a uma categoria no UITableViewCell, assim:
Como o separador pode desaparecer em uma célula diferente daquela selecionada atualmente, provavelmente é uma boa ideia chamar essa correção em todas as células na exibição de tabela. Para isso, você pode adicionar ao UITableView uma categoria semelhante a esta:
Com isso, você pode ligar
-fixSeparatos
seu tableView logo após a ação que os faz desaparecer. No meu caso, foi depois de ligar[tableView beginUpdates]
e[tableView endUpdates]
.Como afirmei no início, testei isso no iOS 8 e no iOS 9. Suponho que funcionará mesmo no iOS 7, mas não tenho como testá-lo lá. Como você provavelmente sabe, isso mexe com as partes internas da célula, para que possa parar de funcionar em algum release futuro. E a Apple poderia teoricamente (0,001% de chance) rejeitar seu aplicativo por causa disso, mas não consigo ver como eles conseguiram descobrir o que você está fazendo lá (verificar o sufixo de uma classe não pode ser detectado pelos analisadores estáticos como algo ruim, IMO).
fonte
Com base no comentário de @ ortwin-gentz, esta solução funciona para mim no iOS 9.
(Código Swift)
Uso a função fixCellsSeparator () após chamar endUpdates () em alguns métodos do meu tableView, por exemplo:
Espero que esta solução seja útil para alguém!
fonte
Complemento à resposta de airpaulg.
Então, basicamente, é preciso implementar dois métodos UITableDelegate. Aqui está a minha solução que funciona no iOS7 e iOS6.
// Isso ocultará a grade da tabela vazia abaixo das células se elas não cobrirem a tela inteira
fonte
Isso corrigiu o problema para mim:
Verifique se
clipsToBounds
está definido como SIM para a célula, mas NÃO para a célulacontentView
. Definir tambémcell.contentView.backgroundColor = [UIColor clearColor];
fonte
Parece que esse problema se manifesta em tantas circunstâncias.
Para mim, tinha algo a ver com a seleção de células. Não tenho idéia do porquê e não tive tempo de investigar muito fundo, mas posso dizer que começou a ocorrer quando defini a célula
selectionStyle
como nenhuma. ou seja:Tentei usar alguns dos métodos de delegação acima que ativam e desativam a
separatorStyle
propriedade do,tableView
mas eles não parecem ter feito nada para corrigir o meu problema.Todo o motivo pelo qual eu precisava disso era porque nem precisava da seleção de células.
Então, encontrei algo que funcionou para mim. Acabei de desativar a seleção no
UITableView
:Espero que isso ajude alguém, se você não precisa ter seleção de células.
fonte
Eu tentei tantas sugestões para corrigir, mas não posso consertar isso.Finalmente, decidi personalizar a linha separadora como abaixo:
P / S: personalizado à vontadeDisplayCell NOT cellForRowAtIndexPath
fonte
Surpreendentemente, mudar o
separatorInset
valor da célula para frente e para trás parece estar funcionando:fonte
Eu também tive o problema dessa exibição inconsistente da linha separadora na parte inferior do meu UITableView. Usando uma visualização de rodapé personalizada, consegui criar uma linha semelhante e exibi-la em cima da potencial existente (que às vezes estava faltando).
O único problema desta solução é que a Apple pode alterar um dia a espessura da linha
fonte
Resolvi colocar essas linhas de código onde a atualização da tableview acontece:
Por exemplo, no meu caso, eu os coloquei aqui:
fonte
Você precisa remover uma seleção de célula antes de fazer a atualização da célula. Então você pode restaurar a seleção.
fonte
Para corrigir o problema acima, adicione rodapé vazio no viewDidLoad.
Por favor, não use as linhas acima no método delegado viewForFooterInSection. Significa Não implementar o método viewForFooterInSection.
fonte
para expandir a resposta airpaulg, porque não funcionou inteiramente para mim ..
eu também tive que implementar o método heightforfooter para obter a altura
então notei que a cor cinza claro está muito escura. Eu consertei isso pegando a cor atual do separador da tableview e usando o seguinte:
UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];
fonte
Eu também encontrei esse problema em nosso projeto. Minha exibição de tabela tinha um tableFooterView que poderia fazer isso acontecer. Eu encontrei o separador abaixo da última linha apareceria se eu removesse o tableFooterView.
fonte
O que fez a diferença para mim foi recarregar a linha para a qual a linha separadora inferior não apareceria:
fonte
Resolvo esse problema de outra maneira: adicione uma camada com altura de 0,5px e cor cinza-clara em tableview.tableFooterView como subcamada.
o código é assim:
fonte
Na subclasse UITableViewCell, implemente layoutSubviews e adicione:
fonte
Como outra pessoa mencionou, esse problema parece se manifestar de várias maneiras. Resolvi meu problema usando a seguinte solução alternativa:
fonte
Analisando as respostas e soluções, fiz essas observações:
Isso parece ser problemático no iOS 7 e 8. Notei o problema ao selecionar a célula do código no
viewDidLoad
método assim:1) a solução alternativa estava sendo feita
viewDidAppear:
se alguém não se importasse com o atraso perceptível entre apresentar a exibição e selecionar a célula2) a segunda solução funcionou para mim, mas o código parece um pouco frágil, pois se baseia na implementação interna do
UITableViewCell
3) adicionar o próprio separador parece ser o mais flexível e o melhor por enquanto, mas exige mais codificação :)
fonte
Definir o estilo
viewWillAppear
funcionou para mim.fonte
Como esse ainda é um problema no IOS 8, adicionarei minha solução no Swift. Defina a linha separadora da tableview como nenhuma. Em seguida, adicione esse código ao método delegado cellForRowAtIndexPath. Ele adicionará um bom separador. A instrução if permite decidir quais células devem ter um separador.
fonte
Aqui está a minha solução para este problema. Depois de inserir seu (s) celular (s), recarregue a seção. Se recarregar a seção inteira for muito intenso para você, basta recarregar os indexPaths acima e abaixo.
fonte
encontrou um problema semelhante, descobri que outra boa solução, especialmente se o dataSource não for grande, recarrega o tableData quando você implementa o
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
método, aqui está um exemplo:Você também pode recarregar dados não visíveis com base na fonte de dados visível, mas isso requer mais hackers.
Lembre-se de que esta função delegada se enquadra no
UITableViewDelegate
protocolo!Espero que ajude!
fonte