No vídeo da WWDC 2013, a Apple sugere exibir o seletor no lugar em uma exibição de tabela no iOS 7. Como inserir e animar uma exibição entre as células da exibição de tabela?
Assim, no aplicativo de calendário da Apple:
No vídeo da WWDC 2013, a Apple sugere exibir o seletor no lugar em uma exibição de tabela no iOS 7. Como inserir e animar uma exibição entre as células da exibição de tabela?
Assim, no aplicativo de calendário da Apple:
Respostas:
Com o iOS7, a Apple lançou o código de amostra
DateCell
.Você pode baixar o código de exemplo aqui: DateCell .
fonte
Você pode usar a resposta que eu dei anteriormente abaixo ou usar esta nova classe no Swift que fiz para tornar essa tarefa muito mais simples e limpa: https://github.com/AaronBratcher/TableViewHelper
Acho que o código fornecido pela Apple é problemático de duas maneiras:
Para tabelas de células estáticas, defino minha célula do seletor de datas abaixo da minha célula de exibição de datas e tenho um sinalizador para identificar se estou editando. Se estiver, retornarei uma altura de célula apropriada, caso contrário, retornarei uma altura de célula zero.
Quando a linha que mostra a data é clicada, altero o sinalizador e faço a animação de atualização para mostrar o seletor.
Se eu tiver vários selecionadores de data / hora na mesma tabela, defino os sinalizadores adequadamente no clique e recarrego as linhas apropriadas. Descobri que posso manter minha tabela estática, usar muito menos código e é mais fácil entender o que está acontecendo.
fonte
Usando o storyboard e uma tabela estática, consegui o mesmo resultado usando o código a seguir. Essa é uma ótima solução, porque se você tiver muitas células de formato estranho ou quiser ter várias células exibidas / ocultadas dinamicamente, esse código ainda funcionará.
fonte
[tableView reloadData];
chamada não é necessária. Atualmente, ela desativa a seleção de linha, mas é melhor desmarcar a linha da seguinte maneira:[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
Peguei a fonte DateCell da Apple e removi o arquivo do storyboard.
Se você quiser um sem storyboard, dê uma olhada em: https://github.com/ajaygautam/DateCellWithoutStoryboard
fonte
UIDatePicker
porUIPickerView
. Eu tentei algumas coisas e consegui mostrarpickerView
em cada célula, mas ele não é atualizado com cada célula. Eu postei minha pergunta e código aqui . Por favor, dê uma olhada e seria muito gentil se você pudesse me sugerir uma solução.UIDatePicker
porUIPickerView
mas com alguns bugs. 1. Falha ao abrirUIPickerView
e rolar a tabela. 2. Ele atribui automaticamente o valor aUILabel
Detalhes nas linhas inferiores da tabela quando os valores estão sendo atribuídos ao rótulo Detalhes nas linhas superiores. Aqui está o meu códigoUm dos melhores tutoriais sobre isso é o iOS 7 UIDatePicker em linha - Parte 2 . Basicamente, aqui eu uso células de exibição de tabela estática e implemento alguns métodos adicionais. Eu usei o Xamarin e o C # para isso:
Você tem que ativo
Clip Subviews
.Definir a altura:
Do que uma variável de classe:
private bool datePickerIsShowing = false;
Mostrar selecionador de data:
Ocultar selecionador de data:
E chamando isso de funções:
fonte
Eu criei meu próprio controlador de exibição personalizado para simplificar o processo de adicionar um selecionador inline inline em uma tableview. Você apenas a subclassifica e segue algumas regras simples e ele lida com a apresentação do seletor de datas.
Você pode encontrá-lo aqui, juntamente com um exemplo de projeto que demonstra como usá-lo: https://github.com/ale84/ALEInlineDatePickerViewController
fonte
Encontrei uma resposta para uma falha no exemplo de célula de dados da apple, onde você deve ter uma linha abaixo da última célula de dados ou obter um erro. No método CellForRowAtIndexPath, substitua a linha ItemData por
Depois de substituir o código de exemplo, agora posso exibir uma célula datePicker sem ter uma célula abaixo dela.
Acabei de ingressar no stackoverflow; portanto, se este estiver no lugar errado ou em outro lugar, peço desculpas.
fonte
A resposta de Aaron Bratcher funcionou, exceto quando usada com várias seções. As animações eram um pouco irregulares e não deslizavam muito bem as próximas seções. Para corrigir isso, eu iterava no próximo conjunto de seções e traduzia as linhas na mesma quantidade que a altura do selecionador de datas.
Editei o didSelectRowAtIndexPath para:
fonte
Adicionando às respostas anteriores,
Tentei as soluções @datinc e @Aaron Bratcher, ambas funcionaram muito bem, mas a animação não era tão limpa em um tableView estático agrupado.
Depois de brincar um pouco, cheguei a esse código que funciona limpo e ótimo para mim -
A principal mudança é usar -
para atualizar a linha, dessa forma, o restante das seções e células da tabela não está animado.
Espero que ajude alguém.
Shani
fonte
Adicionando às respostas anteriores e à solução @Aaron Bratcher ...
Eu estava recebendo animações instáveis desde o iOS 9, e a mesa estava demorando um pouco para carregar e o suficiente para ser irritante. Eu reduzi o tempo para os selecionadores serem lentos para carregar no storyboard. Adicionar os selecionadores de forma programática, e não no storyboard, melhorou o desempenho do carregamento e, como subproduto, a animação é mais suave.
Remova o selecionador de data do storyboard e tenha uma célula vazia, que você define a altura como nas respostas anteriores e, em seguida, chame uma inicialização em viewDidLoad:
Em seguida, implemente a ação, por exemplo
Isso carrega a tabela muito mais rapidamente do que anteriormente. Você também remove a linha de animação,
didSelectRowAtIndexPath
pois ela anima sem problemas (ymmv).fonte
O uso desta resposta sem a animação funciona corretamente no iOS 8.1. Eu o converti em Swift abaixo:
fonte
Aqui está outra maneira de resolver o problema sem números estáticos constantes. Todas as células podem ser usadas em visualizações de tabela estáticas e dinâmicas. Este método usa célula única para o selecionador de título e data!
Entre, você pode ter quantos selecionadores de data em sua mesa desejar!
Crie uma subclasse UITableViewCell :
Crie uma classe CPDatePickerTableViewCell a partir de nossa CPTableViewCell
Na sua view controller, implemente esses dois métodos delegados
Exemplo de como configurar restrições no construtor Interface
Além disso, escrevi classes de células personalizadas para UITextField e UITextView, em que tableView: didSelectRowAtIndexPath: é chamado quando a célula é selecionada!
CPTextFieldTableViewCell
CBTextViewTableViewCell
A altura da célula é dinâmica e a linha aumenta quando o texto é quebrado em uma nova linha!
fonte
A maneira mais fácil de usar o DateCell na versão Swift: use este exemplo .
Arraste a classe " DateCellTableViewController.swift " para o seu projeto.
Open "Main.storyboard" e Copiar " DateCell objeto" ViewController e passado em sua storyboard.
fonte