Animação central com um desenho gráfico principal
-
22-07-2019 - |
Pergunta
Estou dentro de uma subclasse uiview (CustomView no código abaixo).
Estou desenhando uma borda em torno de uma imagem em uma subclasse UIImageView (ContineView). O código gráfico principal para isso está localizado dentro drawInRect:
na subclasse.
A transição de animação principal é um flip, no entanto, quando é desenhado, o código gráfico principal não é usado, ou seja, drawInRect:
não é chamado para fornecer ao calayer minha imagem renderizada.
Em vez disso, recebo a animação de uma imagem para a outra sem que o desenho gráfico principal ocorra.
Como permito que o calayer anime usando meu desenho gráfico principal em vez da imagem bruta?
[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView setImage:image];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[containerView setImage:differentImage];
[CustomView commitAnimations];
Solução
Você está implementando drawRect:
, não drawInRect:
, certo? Além disso, você verificou que fora desta transição, ele realmente funciona?
Você pode colar seu drawRect:
implementação? Só tenho medo de que o UiImageView defina o conteúdo de sua camada diretamente em vez de confiar drawRect:
para fazer isso, o que significaria o seu drawRect:
não funciona.
De fato, dado o quão simples isso é realmente, eu recomendaria que você apenas subclasse uiview em vez do UIImageView. A matemática para preservar a proporção ao escalar a imagem para desenho é bastante simples.
Outra opção é, obviamente, subclasse UiImageView e depois apenas substituir setImage:
Para criar uma nova imagem com base na primeira, mas atrair uma borda em torno disso, e depois passando isso para Super. Dessa forma, você não precisa fazer nada com drawRect:
de forma alguma.
Outras dicas
Ok sim, eu estava implementando drawRect:
, e sim, meu desenho funcionou fora da transição.
O problema era que drawRect:
dentro de a UIImageView
A subclasse não estava sendo chamada pela calayer para o desenho.
Então, quando mudei o pai desta subclasse para UIView
, implementou minha própria propriedade para a imagem e também ajustou a animação - tudo se juntou.
A animação containerView
no código acima, foi alterado para ser uma baunilha UIView
instância. O código de animação teve que ser alterado ligeiramente para acomodar isso:
[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView addSubview:aViewSubclass];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[aViewSubclass removeFromSuperview];
[containerView addSubview:anotherInstanceOfTheViewSubclass];
[CustomView commitAnimations];
Ou seja, dos documentos da Apple sobre esses tipos de transições:
Se você deseja alterar a aparência de uma visão durante uma transição - por exemplo, vire de uma vista para outra -, use uma exibição de contêiner, uma instância de UIView, como segue:
- Comece um bloco de animação.
- Defina a transição na visualização do contêiner.
- Remova a subview da visualização do contêiner.
- Adicione a nova subview à visualização do contêiner.
- Comprometa o bloco de animação.