Animações dentro de layoutSubviews?
-
12-11-2019 - |
Pergunta
Eu tenho um modo de exibição (LSTabBarView), que apoia a inserção/exclusão de novos elementos com os seguintes métodos:
- (void)insertItem:(LSTabItem *)item atIndex:(NSUInteger)index animated:(BOOL)animated;
- (void)removeItemAtIndex:(NSUInteger)index animated:(BOOL)animated;
LSTabItem é o objeto que representa a minha classe do modelo.Cada vez que um novo elemento é adicionado com insertItem:atIndex:animação:uma nova visualização secundária é criado (LSTabControl) usando as informações dentro deste modelo de objecto e, em seguida, adicionado à vista principal, e, finalmente, layoutSubviews é chamado para recalcular o quadro de cada subviews.
Eu tenho apenas a implementação dessas operações, mas o "animado" parâmetro não é usado para agora e Eu queria saber onde devo colocar o código para lidar com a animação quando a animação é SIM.
Estes são os métodos relevantes:
- (void)insertItem:(LSTabItem *)item
atIndex:(NSUInteger)index
animated:(BOOL)animated
{
...
LSTabControl *tab = [self _configureNewTabControlForItem:item atIndex:index];
[tabItems insertObject:item atIndex:index];
[tabViews insertObject:tab atIndex:index]; // array which contains all the subviews
[self setNeedsLayout];
}
- (void)removeItemAtIndex:(NSUInteger)index
animated:(BOOL)animated
{
...
LSTabControl *tab = [tabViews objectAtIndex:index];
...
[tab removeFromSuperview];
[tabViews removeObjectAtIndex:index];
[tabItems removeObjectAtIndex:index];
[self setNeedsLayout];
}
O que layoutSubviews fazer é, basicamente, colocar todos os subviews linear horizontal seqüência, um após o outro a aplicação de um preenchimento entre cada visualização secundária.Cada visualização secundária poderia ter uma outra largura ou altura (eles não são de tamanho fixo).Quando um novo elemento é adicionado com animação definida como SIM (permite dizer que, no index=2) quero que cada subviews de índice+1 para numberOfElements são deslocadas para a direita e, em seguida, a nova visualização secundária aparecem no buraco.
Eu quero, obviamente, LSTabBarView para ser extensível, então, na minha base de implementação destes métodos, não posso fazer suposições sobre como o subviews será organizado por subclasses (por exemplo, uma subclasse pode substituir layoutSubviews e decidir o layout de elementos em um layout vertical em vez de horizontal e, por consequência, decide mudar cada subviews para baixo em vez de para a direita quando a adição de novos elementos (...)
Eu não quero saber como faço para realizar a animação (que eu já sei como fazê-lo), mas o que é a abordagem correta, como animar o aparecimento de uma nova visualização secundária, tendo em conta a minha requisitos descritos acima.
Devo considerar para executar todas as animações dentro de layoutSubviews ou coloca a animação código dentro de insertItem/removeItem deixar layoutSubviews apenas para calcular o subviews layout?
Obrigado
Solução
layoutSubviews
destinado a ser one-shot método rápido.Melhor utilizar o seu insertItem:
para a animação.