animazione semplice tramite ritardato disegno
-
22-08-2019 - |
Domanda
Sto cercando di attuare alcune molto semplice linea di disegno di animazione per il mio iPhone app. Vorrei disegnare un rettangolo sul mio punto di vista, dopo un ritardo. Sto usando performSelector
di eseguire il mio metodo di disegno.
-(void) drawRowAndColumn: (id) rowAndColumn
{
int rc = [rowAndColumn intValue];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
CGRect rect = CGRectMake(rc * 100, 100, 100, 100);
CGContextAddRect(context, rect);
CGContextDrawPath(context, kCGPathFillStroke);
}
che viene poi richiamato tramite:
int col = 10;
[self performSelector:@selector(drawRowAndColumn:)
withObject:[NSNumber numberWithInt:col]
afterDelay:0.2];
Ma sembra che quando il messaggio drawRowAndColumn:
viene effettivamente inviato, non ha più accesso ad un CGContextRef
valida, come ricevo errori come ad esempio:
<Error>: CGContextAddRect: invalid context
Se si sostituisce la performSelector
con una chiamata diretta a drawRowAndColumn
, funziona benissimo. Così la mia prima idea era quella di passare anche nel CGContextRef
tramite il performSelector
, ma io non riesco a capire come passare argomenti multipli allo stesso tempo (questa è un'altra buona domanda.)
Cosa c'è di sbagliato con il codice di cui sopra?
Soluzione
Non si può semplicemente richiamare in qualsiasi momento come quello. È necessario implementare il metodo drawRect:
di UIView e mettere il vostro codice di disegno in là.
Per arrivare drawRect:
al fuoco è necessario far cacao sapere che la vista ha bisogno di essere disegnato. Per questo si può chiamare setNeedsDisplay
, o setNeedsDisplayInRect:
.
Direttamente tradurre il vostro tentativo in questo modo si definirebbe setNeedsDisplay utilizzando performSelector: withObject: afterDelay - ma che probabilmente non è un buon modo di fare animazione
. Dipende cosa si sta realmente cercando di fare - ma si potrebbe prendere in considerazione, per esempio, mettere il vostro codice di disegno in drawRect
come ho suggerito, ma avviare la vista nascosta. Si potrebbe quindi chiamare setHidden: NO utilizzando performSelector per farlo apparire dopo un ritardo - o si potrebbe agevolmente animare in avviando non nascosto, ma con un alfa pari a 0, poi cambiare alfa per 1 all'interno di un blocco UIView animazione (c'è un sacco su questo nella documentazione).