Animazione di base con un disegno di grafica di base
-
22-07-2019 - |
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];
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:
- Inizia un blocco animazione.
- Imposta la transizione nella vista contenitore.
- Rimuovi la vista secondaria dalla vista contenitore.
- Aggiungi la nuova sottoview alla vista contenitore.
- Commette il blocco animazione.