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];
Foi útil?

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:

  1. Comece um bloco de animação.
  2. Defina a transição na visualização do contêiner.
  3. Remova a subview da visualização do contêiner.
  4. Adicione a nova subview à visualização do contêiner.
  5. Comprometa o bloco de animação.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top