Estou usando um UITableView
'layout' para o conteúdo do layout. Estou usando os cabeçalhos da exibição de tabela para fazer o layout de certas imagens, etc., e eu preferiria que elas não flutuassem, mas permanecessem estáticas como quando o estilo está definido UITableViewStyleGrouped
.
Além de usar UITableViewStyleGrouped
, existe uma maneira de fazer isso? Eu gostaria de evitar o uso agrupado, pois adiciona uma margem abaixo de todas as minhas células e requer a desativação da exibição em segundo plano de cada uma das células. Eu gostaria de ter controle total do meu layout. Idealmente, eles seriam "UITableViewStyleBareBones", mas eu não vi essa opção nos documentos ...
Muito Obrigado,
ios
objective-c
iphone
cocoa-touch
uikit
Complicado
fonte
fonte
Respostas:
Você poderá fingir isso usando uma célula personalizada para fazer as linhas do cabeçalho. Eles serão rolados como qualquer outra célula na exibição da tabela.
Você só precisa adicionar alguma lógica
cellForRowAtIndexPath
para retornar o tipo de célula correto quando for uma linha de cabeçalho.Você provavelmente terá que gerenciar suas seções sozinho, ou seja, ter tudo em uma seção e falsificar os cabeçalhos. (Você também pode tentar retornar uma exibição oculta para a exibição do cabeçalho, mas não sei se isso funcionará)
fonte
Uma maneira provavelmente mais fácil de conseguir isso:
Objetivo-C:
Rápido:
Os cabeçalhos de seção agora rolam como qualquer célula normal.
fonte
(Para quem já chegou aqui devido ao estilo de tabela incorreto) Altere o estilo da tabela de comum para agrupado, por meio do inspetor de atributos ou por código:
fonte
TableView Style
propriedade no AttributesInspector.AVISO : esta solução implementa um método de API reservado. Isso pode impedir que o aplicativo seja aprovado pela Apple para distribuição na AppStore.
Eu descrevi os métodos particulares que alternam os cabeçalhos de seção flutuando no meu blog
Basicamente, você só precisa subclassificar
UITableView
e retornarNO
em dois de seus métodos:fonte
Ok, eu sei que é tarde, mas eu tive que fazê-lo. Eu já passei 10 horas procurando uma solução funcional, mas não encontrei uma resposta completa. Encontrou algumas dicas, mas é difícil para os iniciantes entenderem. Então eu tive que colocar meus 2 centavos e completar a resposta.
Como foi sugerido nas poucas respostas, a única solução de trabalho que consegui implementar é inserir células normais na exibição da tabela e manipulá-las como cabeçalhos de seção, mas a melhor maneira de alcançá-la é inserindo essas células em linha 0 de cada seção. Dessa forma, podemos lidar com esses cabeçalhos não flutuantes personalizados com muita facilidade.
Então, os passos são.
Implemente UITableView com o estilo UITableViewStylePlain.
Implemente titleForHeaderInSection como de costume (você pode obter esse valor usando sua própria lógica, mas eu prefiro usar delegados padrão).
Implementar numberOfSectionsInTableView como de costume
Implemente numberOfRowsInSection como de costume.
Retorne 0,0f em heightForHeaderInSection.
NÃO implemente viewForHeaderInSection. Remova o método completamente em vez de retornar nulo.
Em heightForRowAtIndexPath. Verifique se (indexpath.row == 0) e retorne a altura da célula desejada para o cabeçalho da seção, caso contrário, retorne a altura da célula.
Agora, em cellForRowAtIndexPath, verifique se (indexpath.row == 0) e implemente a célula como deseja que o cabeçalho da seção seja e defina o estilo de seleção como none. ELSE implementa a célula como deseja que seja a célula normal.
Agora implemente willSelectRowAtIndexPath e retorne nulo se indexpath.row == 0. Isso cuidará para que didSelectRowAtIndexPath nunca seja acionado para a linha de cabeçalho da Seção.
E, finalmente, em didSelectRowAtIndexPath, verifique se (indexpath.row! = 0) e continue.
Com isso você está pronto. Agora você tem um cabeçalho de seção não flutuante e perfeitamente rolante.
fonte
No seu Interface Builder, clique no seu problema. Table View
Em seguida, navegue até o Attributes Inspector e altere Style Plain para Grouped;) Easy
fonte
O interessante de UITableViewStyleGrouped é que o tableView adiciona o estilo às células e não ao TableView.
O estilo é adicionado como backgroundView às células como uma classe chamada UIGroupTableViewCellBackground, que lida com o desenho de segundo plano diferente de acordo com a posição da célula na seção.
Portanto, uma solução muito simples será usar UITableViewStyleGrouped, defina backgroundColor da tabela como clearColor e substitua simplesmente backgroundView da célula em cellForRow:
fonte
Altere seu estilo do TableView:
De acordo com a documentação da Apple para o UITableView:
fonte
Existe outra maneira complicada. A idéia principal é dobrar o número da seção, e a primeira mostra apenas o headerView enquanto a segunda mostra as células reais.
O que é necessário fazer é implementar os delegados headerInSection:
Essa abordagem também tem pouco impacto nas suas fontes de dados:
Comparando com outras abordagens, dessa maneira é seguro, sem alterar o quadro ou as inserções de conteúdo da visualização da tabela. Espero que isso possa ajudar.
fonte
A maneira mais fácil de obter o que deseja é definir o estilo da tabela como
UITableViewStyleGrouped
, separador comoUITableViewCellSeparatorStyleNone
:Não tente retornar a visualização do rodapé
nil
, pois não se esqueça de definir a altura do cabeçalho e a visualização do cabeçalho, depois de obter o que deseja.fonte
Embora isso possa não resolver o seu problema, foi o que aconteceu comigo quando quis fazer algo semelhante. Em vez de definir o cabeçalho, usei o rodapé da seção acima. O que me salvou foi que esta seção era pequena e estática por natureza, portanto nunca rolou abaixo da parte inferior da exibição.
fonte
Para Swift 3+
Basta usar
UITableViewStyleGrouped
e definir a altura do rodapé para zero com o seguinte:fonte
.leastNormalMagnitude
. Também é necessário implementartableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
viewForFooterInSection
função neste caso.0
e.leastNormalMagnitude
teve o mesmo efeito.viewForFooterSection
É necessário implementar o método. Você deve retornar nulo. Isso está no Swift 5.1 com o Xcode 11.3.1.Enquanto pensava em como abordar esse problema, lembrei-me de um detalhe muito importante sobre o UITableViewStyleGrouped. A maneira como o UITableView implementa o estilo agrupado (as bordas arredondadas ao redor das células) é adicionando um backgroundView personalizado ao UITableViewCells, e não ao UITableView. A cada célula é adicionado um backgroundView de acordo com sua posição na seção (as linhas superiores obtêm a parte superior da borda da seção, as do meio obtêm a borda lateral e a inferior fica - bem, a parte inferior). Portanto, se apenas queremos um estilo simples e não temos um backgroundView personalizado para nossas células (que é o caso em 90% das vezes), tudo o que precisamos fazer é usar UITableViewStyleGrouped e remover o fundo personalizado . Isso pode ser feito seguindo estas duas etapas:
Altere nosso estilo tableView para UITableViewStyleGrouped Adicione a seguinte linha ao cellForRow, imediatamente antes de retornar a célula:
cell.backgroundView = [[[alocação de UIView] initWithFrame: cell.bounds] autorelease];
E é isso. O estilo tableView se tornará exatamente como UITableViewStylePlain, exceto os cabeçalhos flutuantes.
Espero que isto ajude!
fonte
Talvez você possa usar
scrollViewDidScroll
na mesaVer e alterar ocontentInset
base no cabeçalho visível atual.Parece funcionar para o meu caso de uso!
fonte
Outra maneira de fazer isso é criar uma seção vazia antes da que você deseja colocar o cabeçalho e colocá-lo nessa seção. Como a seção está vazia, o cabeçalho rolará imediatamente.
fonte
Você pode adicionar uma seção (com zero linhas) acima e definir o sectionFooterView acima como o headerView da seção atual, o footerView não flutua. Espero que ajude.
fonte
Ignore o XAK. Não explore métodos privados se quiser que seu aplicativo seja aceito pela Apple.
Isso é mais fácil se você estiver usando o Interface Builder. Você adicionaria uma UIView na parte superior da visualização (para onde as imagens irão) e, em seguida, adicionaria sua tableview abaixo dela. O IB deve dimensioná-lo adequadamente; ou seja, a parte superior da tableview toca a parte inferior da UIView que você acabou de adicionar e a altura cobre o restante da tela.
O pensamento aqui é que, se esse UIView não for realmente parte da visualização da tabela, ele não será rolado com a visualização da tabela. ou seja, ignore o cabeçalho do tableview.
Se você não estiver usando o construtor de interface, é um pouco mais complicado, pois é necessário obter o posicionamento e a altura corretos para a visualização da tabela.
fonte
Verifique a resposta de como implementar cabeçalhos com o StoryBoard: Exibições de cabeçalho da tabela no StoryBoards
Observe também que, se você não implementar
não flutuará, exatamente o que você deseja.
fonte
Para remover completamente as seções do cabeçalho da seção flutuante, faça o seguinte:
return nil
não funcionaPara desativar a flutuação, mas ainda mostrar os cabeçalhos das seções, você pode fornecer uma exibição personalizada com seus próprios comportamentos.
fonte
Uma variação na solução do @ samvermette:
fonte
O trecho exibe um cabeçalho fixo apenas para a primeira seção. Outros cabeçalhos de seção flutuam com células.
fonte
Isso pode ser conseguido atribuindo a exibição do cabeçalho manualmente no método viewDidLoad do UITableViewController em vez de usar o viewForHeaderInSection e heightForHeaderInSection do delegado. Por exemplo, na sua subclasse de UITableViewController, você pode fazer algo assim:
A visualização do cabeçalho desaparecerá quando o usuário rolar. Não sei por que isso funciona assim, mas parece alcançar o que você deseja fazer.
fonte
Talvez você possa simplesmente tornar transparente o plano de fundo da visualização do cabeçalho:
Ou aplique-o globalmente:
fonte
Eu tenho outra solução ainda mais simples, para ser usada sem autolayout e com tudo feito através do XIB:
1 / Coloque seu cabeçalho na tableview arrastando e soltando-o diretamente na tableview.
2 / No Inspetor de tamanho do cabeçalho recém-fabricado, basta alterar o tamanho automático: você deve deixar apenas as âncoras superior, esquerda e direita, além do preenchimento horizontalmente.
Isso deve fazer o truque!
fonte
De acordo com a resposta de @ samvermette, eu implementei o código acima no Swift para facilitar o uso rápido dos codificadores.
fonte
ref: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
PLUSE
Isso ajudou a usar o espaço do cabeçalho
fonte
Atualização mais recente de 2020
Testado com o Xcode 14.
Para ocultar qualquer cabeçalho da seção, Retornar nulo para o título do delegado da seção
fonte
você pode conseguir isso facilmente implementando o método viewForHeaderInSection na classe de delegado tableview. esse método espera um UIView como objeto de retorno (que é sua visualização de cabeçalho). eu fiz a mesma coisa no meu código
fonte