Encontrei uma solução MUITO SIMPLES para isso como um efeito colateral de um UITableView
trabalho em que eu estava .....
Armazene a altura da célula em uma variável que reporte a altura original normalmente via tableView: heightForRowAtIndexPath:
, e quando desejar animar uma alteração de altura, basta alterar o valor da variável e chamar isso ...
[tableView beginUpdates];
[tableView endUpdates];
Você descobrirá que não faz uma recarga completa, mas é suficiente para UITableView
saber que precisa redesenhar as células, capturando o novo valor de altura da célula ... e adivinhe? ANIMA a mudança para você. Doce.
Eu tenho uma explicação mais detalhada e exemplos de código completo no meu blog ... Animar alteração de altura da célula UITableView
You can also use this method followed by the endUpdates method to animate the change in the row heights without reloading the cell.
developer.apple.com/library/ios/documentation/UIKit/Reference/…Eu gosto da resposta de Simon Lee. Na verdade, eu não tentei esse método, mas parece que ele mudaria o tamanho de todas as células da lista. Eu esperava uma alteração apenas da célula que é tocada. Eu meio que fiz isso como Simon, mas com apenas uma pequena diferença. Isso mudará a aparência de uma célula quando ela for selecionada. E isso anima. Apenas outra maneira de fazer isso.
Crie um int para manter um valor para o índice de célula selecionado atual:
Então:
Então:
Tenho certeza de que você pode fazer alterações semelhantes no tableView: cellForRowAtIndexPath: para alterar o tipo de célula ou até carregar um arquivo xib para a célula.
Assim, o currentSelection começará em 0. Você precisaria fazer ajustes se não quisesse que a primeira célula da lista (no índice 0) parecesse selecionada por padrão.
fonte
Adicione uma propriedade para acompanhar a célula selecionada
Defina-o como um valor sentinela em (por exemplo)
viewDidLoad
, para garantir que oUITableView
início na posição 'normal'Em
heightForRowAtIndexPath
você pode definir a altura desejada para a célula selecionadaAo
didSelectRowAtIndexPath
salvar a seleção atual e salvar uma altura dinâmica, se necessárioEm
didDeselectRowAtIndexPath
definir o índice de seleção de volta ao valor sentinela e animar a célula de volta à forma normalfonte
reloadData não é bom porque não há animação ...
Isto é o que estou tentando atualmente:
Quase funciona direito. Quase. Estou aumentando a altura da célula e, às vezes, há um pequeno "soluço" na visualização da tabela à medida que a célula é substituída, como se alguma posição de rolagem na visualização da tabela estivesse sendo preservada, a nova célula (que é a primeira célula na tabela) termina com o deslocamento muito alto e a visualização de rolagem é exibida para reposicioná-lo.
fonte
Não sei o que todo esse material sobre como chamar beginUpdates / endUpdates em sucessão é: você pode apenas usar
-[UITableView reloadRowsAtIndexPaths:withAnimation:]
. Aqui está um exemplo de projeto .fonte
Eu resolvi com
reloadRowsAtIndexPaths
.Eu salvo no
didSelectRowAtIndexPath
indexPath da célula selecionada e ligoreloadRowsAtIndexPaths
no final (você pode enviar o NSMutableArray para a lista de elementos que deseja recarregar).Em
heightForRowAtIndexPath
você pode verificar se indexPath está na lista ou não da cela de expandIndexPath e altura de envio.Você pode verificar este exemplo básico: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam É uma solução simples.
eu adiciono um tipo de código se te ajudar
fonte
Em vez de
beginUpdates()
/endUpdates()
, a chamada recomendada é agora:A Apple diz que, em relação a beginUpdates / endUpdates: "Use o método performBatchUpdates (_: conclusão :) em vez deste, sempre que possível."
Consulte: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates
fonte
Tente isto para expandir a linha indexwise:
fonte
fonte
apenas uma observação para alguém como eu pesquisando adicionar "Mais detalhes" na célula personalizada.
Fez um excelente trabalho, mas não se esqueça de "cortar" a exibição da célula. No Interface Builder, selecione sua célula -> Exibição de conteúdo -> no Property Inspector e selecione " Subvisão de clipe "
fonte
Heres uma versão mais curta da resposta de Simons para Swift 3. Também permite alternar a seleção da célula
fonte
Swift 4 e acima
adicione o código abaixo ao método de delegação de linha didselect do tableview
fonte
Versão rápida da resposta de Simon Lee.
Em seguida, em didSelectRowAtIndexPath ()
fonte
Sim é possivel.
UITableView
tem um método delegadodidSelectRowAtIndexPath
Mas no seu caso, se o usuário rolar e selecionar uma célula diferente, você precisará ter a última célula selecionada para diminuir e expandir as
reloadRowsAtIndexPaths:
chamadas de célula atualmente selecionadas ,heightForRowAtIndexPath:
portanto, manipule-as adequadamente.fonte
Aqui está o meu código de
UITableView
subclasse personalizada , que se expandeUITextView
na célula da tabela, sem recarregar (e perder o foco do teclado):fonte
Eu usei a resposta incrível do @ Joy, e funcionou perfeitamente com o iOS 8.4 e o XCode 7.1.1.
Caso você esteja procurando tornar seu celular compatível, alterei o -tableViewDidSelect para o seguinte:
Espero que isso ajude você.
fonte
Verifique este método após o iOS 7 e posterior.
Foram feitas melhorias no iOS 8. Podemos configurá-lo como propriedade da própria exibição de tabela.
fonte
Versão rápida da resposta de Simon Lee :
Lembre-se de que você deve modificar as propriedades da altura ANTES
endUpdates()
.fonte
Entradas -
tableView.beginUpdates () tableView.endUpdates () essas funções não chamarão
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
Mas, se o fizer, tableView.reloadRows (em: [selectedIndexPath! As IndexPath], com: .none)
Ele chamará o func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} nessa função.
fonte
Eu apenas resolvi esse problema com um pequeno truque:
Quando preciso expandir a altura da célula, defino
isInEdit = YES
e chamo o método[self onTimer]
e ele anima o crescimento da célula até atingir o valor s_CellHeightEditing :-)fonte
Obtenha o caminho do índice da linha selecionada. Recarregue a tabela. No método heightForRowAtIndexPath de UITableViewDelegate, defina a altura da linha selecionada para uma altura diferente e, para os outros, retorne a altura normal da linha
fonte
[table reloadData]
resultados na mudança de altura acontece instantaneamente, em vez de animar.