Domanda

Sono all'interno di una sottoclasse UIView (CustomView nel codice seguente).

Sto disegnando un bordo attorno a un'immagine in una sottoclasse UIImageView (containerView). Il codice Core Graphics per questo si trova all'interno di drawInRect: nella sottoclasse.

La transizione di Core Animation è un capovolgimento, tuttavia quando viene disegnato, il codice Core Graphics non viene utilizzato, ovvero drawInRect: non viene chiamato per fornire a CALayer la mia immagine renderizzata.

Invece ottengo l'animazione da un'immagine all'altra senza che si verifichi alcun disegno di grafica principale.

Come posso consentire a CALayer di animarsi usando il mio disegno Core Graphics piuttosto che l'immagine raw?

[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView setImage:image];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[containerView setImage:differentImage];
[CustomView commitAnimations];
È stato utile?

Soluzione

Stai implementando drawRect: , non drawInRect: , giusto? Inoltre, hai verificato che al di fuori di questa transizione funziona davvero?

Puoi incollare la tua implementazione drawRect: ? Ho solo paura che UIImageView imposti direttamente il contenuto del suo layer invece di fare affidamento su drawRect: , il che significherebbe che drawRect: non funziona.

In effetti, dato quanto è semplice, ti consiglierei di sottoclassare UIView invece di UIImageView. La matematica per preservare le proporzioni quando si ridimensiona l'immagine per il disegno è piuttosto semplice.

Un'altra opzione è, ovviamente, la sottoclasse di UIImageView e quindi solo l'override di setImage: per creare una nuova immagine basata sulla prima ma disegnando un bordo attorno a quella, e poi passando a super. In questo modo non devi fare nulla con drawRect: .

Altri suggerimenti

Va ??bene sì, stavo implementando drawRect: e sì, il mio disegno ha funzionato al di fuori della transizione.

Il problema era che drawRect: all'interno di una sottoclasse UIImageView non veniva chiamato dal CALayer per il disegno.

Quindi, quando ho cambiato il genitore di questa sottoclasse in UIView , ho implementato la mia proprietà per l'immagine e ho anche regolato l'animazione: tutto si è unito.

L'animazione containerView nel codice sopra, è stata cambiata in un'istanza UIView vaniglia. Il codice di animazione ha dovuto essere leggermente modificato per adattarlo a questo:

[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];

vale a dire. dai documenti di Apple su questo tipo di transizioni:

  

Se si desidera modificare l'aspetto   di una vista durante una transizione & # 8212; per   esempio, capovolgi da una vista a   un altro & # 8212; quindi utilizza una vista contenitore, un   istanza di UIView, come segue:

     
      
  1. Inizia un blocco animazione.
  2.   
  3. Imposta la transizione nella vista contenitore.
  4.   
  5. Rimuovi la vista secondaria dalla vista contenitore.
  6.   
  7. Aggiungi la nuova sottoview alla vista contenitore.
  8.   
  9. Commette il blocco animazione.
  10.   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top