Eu tenho um UITableView com duas seções. É uma visão simples da tabela. Estou usando o viewForHeaderInSection para criar modos de exibição personalizados para esses cabeçalhos. Por enquanto, tudo bem.
O comportamento de rolagem padrão é que, quando uma seção é encontrada, o cabeçalho da seção permanece ancorado abaixo da barra de navegação até que a próxima seção seja exibida.
Minha pergunta é a seguinte: posso alterar o comportamento padrão para que os cabeçalhos da seção NÃO fiquem ancorados na parte superior, mas role pela barra de navegação com o restante das linhas da seção?
Estou perdendo algo óbvio?
Obrigado.
ios
iphone
uitableview
cocoa-touch
davidjhinson
fonte
fonte
Respostas:
A maneira que resolvi esse problema é ajustar o
contentOffset
acordo com ocontentInset
noUITableViewControllerDelegate
(estendeUIScrollViewDelegate
) assim:O único problema aqui é que ele perde um pouco de força ao rolar de volta para o topo.
{OBSERVAÇÃO: O "40" deve ter a altura exata do SEU cabeçalho da seção 0. Se você usar um número maior que a altura do cabeçalho da seção 0, verá que a sensação do dedo é afetada (tente "1000" e verá que o comportamento do salto é meio estranho no topo). se o número corresponder à altura do cabeçalho da seção 0, a sensação do dedo parecerá perfeita ou quase perfeita.}
fonte
Você também pode adicionar uma seção com zero linhas na parte superior e simplesmente usar o rodapé da seção anterior como cabeçalho da próxima.
fonte
Se eu fizesse isso, aproveitaria o fato de que UITableViews no estilo Plain tem os cabeçalhos fixos e os no estilo Agrupado não. Provavelmente, pelo menos, tentaria usar uma célula de tabela personalizada para imitar a aparência de células simples em uma tabela agrupada.
Na verdade, eu não tentei isso, por isso pode não funcionar, mas é o que eu sugiro fazer.
fonte
tableView.separatorColor = [UIColor clearColor];
para imitar uma exibição de tabela simples.Sei que chega tarde, mas encontrei a solução definitiva!
O que você deseja fazer é se você tiver 10 seções, deixe o dataSource retornar 20. Use números pares para cabeçalhos de seção e números ímpares para o conteúdo da seção. algo assim
Voilá! : D
fonte
UITableView
que estou usando.Há várias coisas que precisam ser feitas para resolver esse problema de maneira não hacky:
UITableViewStyleGrouped
backgroundColor
como[UIColor clearColor]
backgroundView
célula de exibição em cada tabela como uma exibição vazia combackgroundColor [UIColor clearColor]
rowHeight
adequadamente ou substituatableView:heightForRowAtIndexPath:
se as linhas individuais tiverem alturas diferentes.fonte
UITableViewStyleGrouped
as células da tabela possuem margens extras que alteram seu alinhamento com o cabeçalho. Esse é um problema quando você realmente deseja representar uma tabela com várias colunas e usar o cabeçalho para mostrar os títulos das colunas (e depois alinhar as entradas individuais da tabela com esses títulos).Originalmente publicado Aqui , uma solução rápida usando o IB. O mesmo pode ser feito programaticamente, embora de maneira simples.
Algumas pessoas comentaram dizendo que esta solução oculta o primeiro cabeçalho, no entanto, eu não percebi esse problema. Funcionou perfeitamente para mim e foi de longe a solução mais simples que vi até agora.
fonte
Eu não estava satisfeito com as soluções descritas aqui até agora, então tentei combiná-las. O resultado é o seguinte código, inspirado em @awulf e @cescofry. Funciona para mim porque não tenho cabeçalho de exibição de tabela real. Se você já possui um cabeçalho de exibição de tabela, pode ser necessário ajustar a altura.
fonte
Basta alterar o estilo do TableView:
Documentação UITableViewStyle :
fonte
Selecione o estilo de Visualização de tabela agrupada no Inspetor de atributos do tableView no storyboard.
fonte
Defina o headerView da tabela com uma vista transparente com a mesma altura do cabeçalho na vista de seção. Também inicie a visualização da tabela com um quadro na altura.
fonte
Encontrei uma solução alternativa, use a primeira célula de cada seção em vez de uma seção de cabeçalho real; essa solução não parece tão limpa, mas funciona tão bem que você pode usar uma célula de protótipo definida para a seção de cabeçalhos e no método cellForRowAtIndexPath solicite o indexPath.row == 0, se verdadeiro, use a célula protótipo da seção do cabeçalho; caso contrário, use a célula protótipo padrão.
fonte
indexPath.row
&indexPath.section
, certifique-se de retornar uma altura de0.0f
para- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
que seus cabeçalhos fiquem invisíveis.Altere seu estilo do TableView:
De acordo com a documentação da Apple para o UITableView:
fonte
Agora que o estilo agrupado parece basicamente o mesmo do iOS 7 (em termos de nivelamento e plano de fundo), para nós, a melhor e mais fácil (ou seja, menos hacky) correção foi simplesmente mudar o estilo da visualização da tabela para agrupado. Fazer jack com contentInsets sempre foi um problema quando integramos uma barra de navegação com rolagem na parte superior. Com um estilo de exibição de tabela agrupada, parece exatamente o mesmo (com nossas células) e os cabeçalhos de seção permanecem fixos. Sem estranheza de rolagem.
fonte
Atribua uma inserção negativa ao seu tableView. Se você tem cabeçalhos de seção alta de 22px e não deseja que eles fiquem presos, logo após recarregar os dados, adicione:
Funciona como um encanto para mim. Também funciona para rodapés de seção, basta atribuir a inserção negativa na parte inferior.
fonte
Eu adiciono a tabela a uma exibição de rolagem e isso parece funcionar bem.
fonte
Confira minha resposta aqui . Essa é a maneira mais fácil de implementar os cabeçalhos de seção não flutuantes sem hacks.
fonte
A resposta da @ LocoMike melhor se ajustou ao meu tableView, no entanto, ela quebrou ao usar rodapés também. Portanto, esta é a solução corrigida ao usar cabeçalhos e rodapés:
fonte
Versão rápida da resposta @awulf, que funciona muito bem!
fonte
Aprendi que apenas a configuração da propriedade tableHeaderView faz isso, ou seja:
e é isso.
fonte