2009-03-05 4 views
5

Ich versuche, einfache Paint-Funktionalität in meiner iPhone App zu implementieren. Ich habe versucht, eine Bitmap mit einem Bitmap-Pinsel zu aktualisieren, und ich habe auch versucht this tutorial.kann nicht schnell genug zeichnen, um mit touchesMoved Schritt zu halten?

Beide Methoden haben das gleiche Problem, obwohl der Code fast völlig anders ist. Es passiert nur auf dem Gerät - der Simulator funktioniert gut.

Wenn ich den Bildschirm berühre und meinen Finger bewege, wird der Bildschirm nicht aktualisiert. Wenn ich meinen Finger pausiere oder hebe, wird der Bildschirm aktualisiert. Dies ist keine sehr gute Benutzererfahrung!

Ich habe versucht, drawRect direkt von touchesMoved aufzurufen, aber festgestellt, dass der Zeichnungskontext (den ich mit UIGraphicsGetCurrentContext abrufe) für viele der Aufrufe ungültig ist, so dass der Bildschirm für jeden touchesMoved selbst nicht funktioniert.

Irgendwelche Ideen?

Danke für jede Hilfe, das war ziemlich frustrierend!

Henning

Antwort

0

Sie nicht direkt drawRect anrufen:. Um Ihren Bildschirm bei Bedarf zu aktualisieren, versuchen Sie [self setNeedsDisplay] von Ihrer touchesMoved Methode, die die richtigen Kontexte für einen Anruf zu drawRect: einrichten.

+0

Danke, aber ich habe versucht, ein [self setNeedsDisplay] von touchesMoved. Es hat nicht geholfen. – Henning

2

Es klingt für mich so, als würden Sie der Hauptlaufschleife keine Chance geben, das Display zu aktualisieren. Ihr Zeichencode dauert möglicherweise länger als die Zeit zwischen Berührungsereignissen, sodass die Anzeige nie aktualisiert wird. Wenn Sie Ihren Finger heben, macht er die Aktualisierung, weil er nicht mehr mit Ihrer Zeichnung belastet ist.

Sie betrachten könnte Ihre Zeichnung zu optimieren, es zu beschleunigen (nur innerhalb der schmutzigen Bereich des Bildschirms, zum Beispiel Zeichnung), so etwas wie NSOperationQueue mit den schweren Berechnungen Ihrer Zeichnung Schlange auf einem Hintergrund-Thread ausgeführt werden, oder Löschen von Touch-Zeichnungs-Events selektiv, um Ihre Antwort reibungslos zu halten.

Eine weitere Möglichkeit besteht darin, Ihren schweren Zeichnungscode in eine separate Methode einzufügen und über performSelector: withObject: afterDelay mit einer Verzögerung von 10 Millisekunden (oder weniger) aufzurufen. Dies könnte der Hauptlaufschleife eine Chance geben, die Anzeige mit ihrem aktuellen Zustand zu aktualisieren. Ich habe das nicht getestet, aber wenn ich mich richtig erinnere, habe ich diese Arbeit gesehen.

+0

Ich werde es versuchen und sehen, wie es geht. Vielen Dank. – Henning

Verwandte Themen