É possível cancelar uma UIView
animação enquanto ela está em andamento? Ou eu teria que cair para o nível da CA?
ou seja, eu fiz algo assim (talvez definindo uma ação de animação final também):
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties
// set view properties
[UIView commitAnimations];
Porém, antes que a animação seja concluída e o evento finalize, quero cancelá-la (abrevie). Isso é possível? Ao pesquisar no Google, algumas pessoas fazem a mesma pergunta sem respostas - e uma ou duas pessoas especulando que isso não pode ser feito.
ios
core-animation
uiviewanimation
philsquared
fonte
fonte
Respostas:
O jeito que eu faço é criar uma nova animação para o seu ponto final. Defina uma duração muito curta e use o
+setAnimationBeginsFromCurrentState:
método para iniciar a partir do estado atual. Quando você o define como SIM, a animação atual é cortada. Parece algo assim:fonte
setAnimationBeginsFromCurrentState:
é desencorajado no iOS 4, mas ainda está lá e ainda deve funcionar.Usar:
fonte
A maneira mais simples de interromper imediatamente todas as animações em uma exibição específica é:
Vincule o projeto ao QuartzCore.framework. No início do seu código:
Agora, quando você quiser interromper todas as animações em uma exibição morta nas faixas, diga o seguinte:
A linha do meio funcionaria por si só, mas há um atraso até que o runloop termine (o "momento de redesenho"). Para evitar esse atraso, agrupe o comando em um bloco de transação explícito, como mostrado. Isso funciona, desde que nenhuma outra alteração tenha sido executada nessa camada no loop de execução atual.
fonte
removeAllAnimations
terá o efeito colateral de trazer a animação para o quadro final, em vez de parar onde está no momento.No iOS 4 e superior, use a
UIViewAnimationOptionBeginFromCurrentState
opção na segunda animação para encurtar a primeira.Como exemplo, suponha que você tenha uma visão com um indicador de atividade. Você deseja desvanecer-se no indicador de atividade enquanto alguma atividade potencialmente demorada começa e desaparecer quando a atividade for concluída. No código abaixo, a visualização com o indicador de atividade é chamada
activityView
.fonte
Para cancelar uma animação, basta definir a propriedade que está sendo animada atualmente, fora da animação UIView. Isso interromperá a animação onde quer que esteja, e o UIView irá para a configuração que você acabou de definir.
fonte
-animationDidStop:finished:context:
serve o argumento 'terminado' . Se[finished boolValue] == NO
, você sabe que sua animação foi de alguma forma cancelada.Desculpe ressuscitar esta resposta, mas no iOS 10 as coisas meio que mudaram, e agora o cancelamento é possível e você pode até cancelar graciosamente!
Após o iOS 10, você pode cancelar animações com o UIViewPropertyAnimator !
Se você passar verdadeiro, a animação é cancelada e para exatamente onde você a cancelou. O método de conclusão não será chamado. No entanto, se você passar falso, é responsável por terminar a animação:
Você pode terminar sua animação e permanecer no estado atual (.current) ou ir para o estado inicial (.start) ou para o estado final (.end)
A propósito, você pode até pausar e reiniciar mais tarde ...
Nota: Se você não deseja um cancelamento abrupto, pode reverter sua animação ou até mesmo alterá-la após fazer uma pausa!
fonte
Se você estiver animando uma restrição alterando a propriedade constante em vez de uma visualização, nenhum dos outros métodos funcionará no iOS 8.
Exemplo de animação:
Solução:
Você precisa remover as animações das camadas de qualquer visualização afetada pela alteração de restrição e suas subcamadas.
fonte
self.constraintView.layer.removeAllAnimations()
funciona (Swift)Se você quiser apenas pausar / parar a animação sem problemas
Fonte: Como pausar a animação de uma árvore de camadas
fonte
Nenhuma das opções acima resolveu isso para mim, mas isso ajudou: A
UIView
animação define a propriedade imediatamente e a anima. Ele interrompe a animação quando a camada de apresentação corresponde ao modelo (a propriedade definida).Resolvi meu problema, que era "Quero animar de onde você parece" ('você' significa a exibição). Se você quiser ISSO, então:
CALayer * pLayer = theView.layer.presentationLayer;
defina a posição para a camada de apresentação
Eu uso algumas opções, incluindo
UIViewAnimationOptionOverrideInheritedDuration
Mas como a documentação da Apple é vaga, não sei se ela realmente substitui as outras animações quando usada ou apenas redefine os temporizadores.
E essa deve ser uma solução decente por enquanto.
fonte
fonte
Versão rápida da solução de Stephen Darlington
fonte
Eu tenho o mesmo problema; as APIs não têm nada para cancelar algumas animações específicas. o
+ (void)setAnimationsEnabled:(BOOL)enabled
desativa TODAS as animações e, portanto, não funciona para mim. Existem duas soluções:
1) faça do seu objeto animado uma sub-visualização. Então, quando você desejar cancelar as animações para essa exibição, remova-a ou oculte-a. Muito simples, mas você precisa recriar a subvisão sem animações se precisar mantê-la à vista.
2) repita o anim apenas um e faça um seletor de delegado para reiniciar o anim, se necessário, assim:
O problema com 2) é que sempre há atraso para parar o anim, pois termina o ciclo de animação atual.
Espero que isto ajude.
fonte
Mesmo se você cancelar a animação das maneiras acima, a animação
didStopSelector
ainda será executada. Portanto, se você tiver estados lógicos em seu aplicativo orientados por animações, terá problemas. Por esse motivo, com as formas descritas acima, uso a variável de contexto dasUIView
animações. Se você passar o estado atual do seu programa pelo parâmetro context para a animação, quando a animação parar, suadidStopSelector
função poderá decidir se deve fazer algo ou apenas retornar com base no estado atual e no valor do estado passado como contexto.fonte
fonte
Para pausar uma animação sem reverter o estado para o original ou final:
fonte
Quando trabalho com
UIStackView
animação, além dissoremoveAllAnimations()
, preciso definir alguns valores para o inicial porqueremoveAllAnimations()
pode configurá-los para um estado imprevisível. Eu tenhostackView
comview1
e porview2
dentro, e uma visão deve ser visível e uma oculta:fonte
Nenhuma das soluções respondidas funcionou para mim. Resolvi meus problemas dessa maneira (não sei se é o caminho correto?), Porque tive problemas ao chamar isso muito rápido (quando a animação anterior ainda não estava concluída). Passei minha animação desejada com o bloco customAnim .
fonte