Frage

Ich versuche, einige sehr einfache Strichzeichnung Animation für mein iPhone app zu implementieren. Ich mag ein Rechteck auf meiner Ansicht nach einer Verzögerung ziehen. Ich verwende performSelector meine Ziehverfahren ausgeführt werden.

-(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);

}

Was wird dann aufgerufen über:

int col = 10;
[self performSelector:@selector(drawRowAndColumn:) 
           withObject:[NSNumber numberWithInt:col]
           afterDelay:0.2];

Aber es scheint, dass, wenn die drawRowAndColumn: Nachricht tatsächlich gesendet wird, ist es nicht mehr Zugriff auf einen gültigen CGContextRef hat, wie bekomme ich Fehler wie:

<Error>: CGContextAddRect: invalid context

Wenn ich die performSelector mit einem direkten Aufruf ersetzen drawRowAndColumn, es funktioniert gut. So war meine erste Idee, auch in der CGContextRef über die performSelector passieren, aber ich kann nicht scheinen, um herauszufinden, wie zur gleichen Zeit mehrere Argumente übergeben (das ist eine andere gute Frage.)

Was mit obigem Code falsch?

War es hilfreich?

Lösung

Sie können jederzeit wie das nicht nur zeichnen. Sie müssen die drawRect: Methode von UIView implementieren und dort Ihre Zeichnung Code setzen. Um drawRect: feuern müssen Sie lassen Cocoa wissen, dass die Ansicht gezogen werden muss. Dafür können Sie setNeedsDisplay oder setNeedsDisplayInRect: nennen.

übersetzen Direkt Ihrem Versuch, auf diese Weise Sie setNeedsDisplay mit perform nennen würde: withobject: afterDelay - aber das ist wahrscheinlich kein guter Weg, Animation zu tun

.

Es hängt davon ab, was Sie wirklich zu tun versuchen - aber Sie sollten sich überlegen, zum Beispiel Ihre Zeichnung Code in drawRect setzen, wie ich vorgeschlagen, aber die Ansicht versteckt starten. Sie könnten dann setHidden nennen: NEIN perform mit ihn nach einer Verzögerung erscheinen lassen - oder man könnte es glatt nicht versteckt animiert in durch das Starten, aber mit einem Alpha von 0, dann alpha in einem UIView Animation Block 1 ändern (es gibt viel zu dies in der Dokumentation).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top