Alguém poderia me dizer a maneira de realizar UITableView
animações expansíveis / recolhíveis em sections
de UITableView
como abaixo?
ou
ios
iphone
uitableview
object
Vinnitu
fonte
fonte
Respostas:
Você tem que fazer sua própria linha de cabeçalho personalizada e colocá-la como a primeira linha de cada seção. Subclassificar o
UITableView
ou os cabeçalhos que já estão lá será uma dor. Com base na maneira como eles funcionam agora, não tenho certeza se você pode obter ações deles facilmente. Você pode configurar uma célula para PARECER com um cabeçalho e configurar otableView:didSelectRowAtIndexPath
para expandir ou recolher manualmente a seção em que está.Eu armazenaria uma matriz de booleanos correspondendo ao valor "gasto" de cada uma de suas seções. Em seguida, você pode fazer com que
tableView:didSelectRowAtIndexPath
em cada uma de suas linhas de cabeçalho personalizado alterne esse valor e recarregue essa seção específica.Em seguida, defina
numberOfRowsInSection
para verificar omybooleans
valor e retornar 1 se a seção não estiver expandida ou 1+ o número de itens na seção se estiver expandida.Além disso, você precisará atualizar
cellForRowAtIndexPath
para retornar uma célula de cabeçalho personalizada para a primeira linha em qualquer seção.fonte
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
é a melhor maneira de fornecer seu "próprio cabeçalho personalizado", pois é exatamente para isso que ele foi projetado.Alguns códigos de amostra para animar uma ação de expandir / recolher usando um cabeçalho de seção de exibição de tabela são fornecidos pela Apple aqui: Animações e gestos de exibição de tabela
A chave para essa abordagem é implementar
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
e retornar um UIView personalizado que inclui um botão (normalmente do mesmo tamanho que a própria visualização do cabeçalho). Subclassificando UIView e usando-o para a visualização do cabeçalho (como este exemplo faz), você pode armazenar facilmente dados adicionais, como o número da seção.fonte
dequeueReusableHeaderFooterViewWithIdentifier
) - clique nessa seta e role de volta para a primeira reprodução e tente fechá-la -> NSInternalInconsistencyException (iOS 8.4 / iPhone 5s)Eu tenho uma boa solução inspirada nas animações e gestos de exibição de mesa da Apple . Excluí partes desnecessárias da amostra da Apple e traduzi para o swift.
Sei que a resposta é bastante longa, mas todo o código é necessário. Felizmente, você pode apenas copiar e colar a maior parte do código e só precisa fazer algumas modificações nas etapas 1 e 3
1. criar
SectionHeaderView.swift
eSectionHeaderView.xib
o
SectionHeaderView.xib
(a visualização com fundo cinza) deve ser parecido com isto em um tableview (você pode personalizá-lo de acordo com suas necessidades, é claro):Nota:
a) a
toggleOpen
ação deve estar ligada adisclosureButton
b) a ação
disclosureButton
etoggleOpen
não são necessárias. Você pode excluir essas 2 coisas se não precisar do botão.2. criar
SectionInfo.swift
3. em seu tableview
fonte
Para implementar a seção de tabela recolhível no iOS, a mágica é como controlar o número de linhas para cada seção, ou podemos gerenciar a altura das linhas para cada seção.
Além disso, precisamos personalizar o cabeçalho da seção para que possamos ouvir o evento tap da área do cabeçalho (seja um botão ou o cabeçalho inteiro).
Como lidar com o cabeçalho? É muito simples, estendemos a classe UITableViewCell e criamos uma célula de cabeçalho personalizada da seguinte forma:
em seguida, use viewForHeaderInSection para conectar a célula do cabeçalho:
lembre-se de que temos que retornar o contentView porque essa função espera que um UIView seja retornado.
Agora vamos lidar com a parte recolhível, aqui está a função de alternância que alterna o suporte recolhível de cada seção:
depende de como você gerencia os dados da seção, neste caso, eu tenho os dados da seção mais ou menos assim:
por último, o que precisamos fazer é baseado na escora recolhível de cada seção, controlar o número de linhas dessa seção:
Tenho uma demonstração totalmente funcional em meu Github: https://github.com/jeantimex/ios-swift-collapsible-table-section
Se você deseja implementar as seções recolhíveis em uma tabela de estilo agrupado, tenho outra demonstração com o código-fonte aqui: https://github.com/jeantimex/ios-swift-collapsible-table-section-in-grouped-section
Espero que ajude.
fonte
Eu tenho uma solução melhor que você deve adicionar um UIButton no cabeçalho da seção e definir o tamanho deste botão igual ao tamanho da seção, mas torná-lo oculto por uma cor de fundo clara, depois disso você pode facilmente verificar qual seção clicou para expandir ou recolher
fonte
tableView:numberOfRowsInSection:
não será alterado e você continuará a ser capaz de usá-lo para o que realmente significa. O mesmo vale paratableView:cellForRowAtIndexPath:
.UITableViewHeaderFooterView
e adiciona umasection
propriedade e define aSectionHeaderViewDelegate
que fornece o retorno de chamada para abrir / fechar a seção. ( developer.apple.com/library/ios/samplecode/TableViewUpdates/… )Acabei criando apenas um headerView que continha um botão (eu vi a solução de Son Nguyen acima depois do fato, mas aqui está meu código ... parece muito, mas é muito simples):
declarar alguns bools para você seções
...código
agora em seus métodos de delegado tableview ...
e, finalmente, a função que é chamada quando você toca em um dos botões do cabeçalho da seção:
fonte
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
o método de recolhimento / recolhimento, ele deve animar bem.Esta é a melhor maneira que encontrei de criar células expansíveis de visualização de tabela
arquivo .h
arquivo .m
Métodos de delegação de visualização de tabela
fonte
Portanto, com base na solução 'botão no cabeçalho', aqui está uma implementação limpa e minimalista:
Aqui está o código:
fonte
Encontrei outra maneira relativamente simples de resolver esse problema. Ao usar este método, não precisaremos alterar nossa célula, que quase sempre está relacionada ao índice de array de dados, potencialmente causando confusão em nosso controlador de visualização.
Primeiro, adicionamos as seguintes propriedades à nossa classe de controlador:
collapsedSections
salvará os números das seções recolhidas.sectionViews
irá armazenar nossa visão de seção personalizada.Sintetize:
Inicialize-o:
Depois disso, devemos conectar nosso UITableView para que ele possa ser acessado de dentro de nossa classe de controlador de visualização:
Conecte-o do XIB para visualizar o controlador usando
ctrl + drag
como de costume.Em seguida, criamos view como cabeçalho de seção personalizado para nossa table view implementando este delegado UITableView:
Em seguida, implementamos o método para salvar nosso cabeçalho de seção personalizado criado anteriormente na propriedade da classe:
Adicione
UIGestureRecognizerDelegate
ao nosso arquivo .h do controlador de visualização:Então nós criamos o método
attachTapGestureToView:
O método acima adicionará reconhecedor de gestos de toque a todas as vistas de seção que criamos antes. Em seguida, devemos implementar o
onTap:
seletorO método acima será invocado quando o usuário tocar em qualquer uma de nossa seção de visualização de tabela. Este método pesquisa o número de seção correto com base em nosso
sectionViews
array que criamos antes.Além disso, implementamos um método para obter a qual seção da visualização do cabeçalho pertence.
Em seguida, devemos implementar o método
toggleCollapseSection:
Este método irá inserir / remover o número da seção de nosso
collapsedSections
array que criamos antes. Quando um número de seção é inserido nessa matriz, significa que a seção deve ser recolhida e expandida caso contrário.Em seguida, implementar
removeCollapsedSection:
,addCollapsedSection:section
eisCollapsedSection:section
Esses três métodos são apenas auxiliares para nos tornar mais fáceis de acessar o
collapsedSections
array.Finalmente, implemente este delegado de visualização de tabela para que nossas visualizações de seção personalizadas tenham uma boa aparência.
Espero que ajude.
fonte
Eu usei um NSDictionary como fonte de dados, parece muito código, mas é muito simples e funciona muito bem! como fica aqui
Eu criei um enum para as seções
propriedade de seções:
Um método que retorna minhas seções:
E então configure meu soruce de dados:
Os próximos métodos irão ajudá-lo a saber quando uma seção é aberta e como responder à fonte de dados tableview:
Responda a seção à fonte de dados:
Ferramentas:
Alternar visibilidade da seção
fonte
// vKj
fonte
// vKj
fonte
Expandindo esta resposta escrita em Objective C, eu escrevi o seguinte para aqueles que escrevem em Swift
A ideia é usar seções dentro da tabela e definir o número de linhas na seção para 1 (recolhido) e 3 (expandido) quando a primeira linha dessa seção for tocada
A tabela decide quantas linhas desenhar com base em uma matriz de valores booleanos
Você precisará criar duas linhas no storyboard e fornecer a elas os identificadores de reutilização 'CollapsingRow' e 'GroupHeading'
fonte
Alguns códigos de amostra para animar uma ação de expandir / recolher usando um cabeçalho de seção de exibição de tabela são fornecidos pela Apple em Animações e gestos de exibição de tabela .
A chave para esta abordagem é implementar
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
e retornar um UIView personalizado que inclui um botão (normalmente do mesmo tamanho que a própria visualização do cabeçalho). Subclassificando UIView e usando-o para a visualização do cabeçalho (como este exemplo faz), você pode armazenar facilmente dados adicionais, como o número da seção.
fonte
Eu fiz a mesma coisa usando várias seções.
fonte
Estou adicionando esta solução para ser completa e mostrando como trabalhar com cabeçalhos de seção.
Link para gist: https://gist.github.com/pawelkijowskizimperium/fe1e8511a7932a0d40486a2669316d2c
fonte
no suporte à solução @ jean.timex, use o código abaixo se quiser abrir uma seção a qualquer momento. crie uma variável como: var extendedSection = -1;
fonte