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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top