2012-04-08 7 views
1

Ich habe eine UIView subclassiert und die Methoden touchesBegan, touchsmoved, tosteSended und drawRect außer Kraft gesetzt, um eine App zu erstellen, mit der der Benutzer durch Berühren des Bildschirms zeichnen kann. Ich verwende die Quartz 2D-Bibliothek, um die Zeichnungen zu erstellen.Mit setNeedsDisplayInRect wird der zugrunde liegende Inhalt gelöscht

In BerührungenBegan, berührtMoved, und berührtEnded, verfolge ich die aktuellen und vorherigen Standorte des Touch-Ereignisses. Jedes Mal, wenn sich die Berührung bewegt und wenn die Berührung endet, rufe ich setNeedsDisplayInRect mit dem kleinsten Rechteck auf, das die vorherige und aktuelle Position der Berührung enthält, um darunter liegende Zeichnungen zu erhalten. (Ich möchte, dass sich alle Zeichnungen wie Ebenen addieren.)

Ich habe ein seltsames Artefakt bemerkt: Beim Erstellen einer Zeichnung, die sich mit einer anderen Zeichnung überlappt, zeichnet Quartz das in setNeedsDisplayInRect übergebene Rechteck, löscht jedoch alles darunter dieses Rechteck.

Ich vermute, dass das Problem auf den Mischmodus zurückzuführen ist, aber ich experimentierte mit einer Reihe von verschiedenen Mischmodi und keiner schien den Trick zu machen.

Wie zeichne ich einen Pfad, der den zugrunde liegenden Inhalt erhält?

Antwort

1

Quarz ist kein Leinwandmodell. Es verfolgt nicht, was in vorherigen Schleifen gezeichnet wurde. Jedes Mal, wenn drawRect: aufgerufen wird, liegt es in Ihrer Verantwortung, mit jedem Pixel in dem Rechteck, das Sie übergeben haben, umzugehen. Standardmäßig löscht Quartz das Rechteck für Sie (eingestellt in UIView clearsContextBeforeDrawing), aber es ist Ihre Aufgabe, den Inhalt jedes Mal zu zeichnen.

Wenn Sie die Dinge Schicht möchten, müssen Sie entweder jedes Ding in seinem eigenen CALayer oder UIView setzen, oder Sie müssen neu gezeichnet jeder jedes Mal überlappt drawRect: genannt wird.

+1

Hmm, in der Dokumentation heißt es: "Quartz 2D verwendet das Modell des Malers für seine Bildgebung. Im Malers Modell wendet jede nachfolgende Zeichenoperation eine Schicht" Farbe "auf eine Ausgabe" Leinwand ", oft eine Seite genannt. " –

+0

Korrekt. Pro Aufruf von 'drawRect:'. Beim nächsten Aufruf von 'drawRect:' erhältst du eine brandneue Leinwand. Wenn ich sage, dass Quartz kein "Canvas" -Modell hat, beziehe ich mich auf die Arten von persistenten Canvas, die HTML5-Entwickler normalerweise erwarten. –

+0

Beachten Sie, dass die andere Möglichkeit, diese dauerhafte Leinwand zu erreichen, darin besteht, in einen Bildkontext zu zeichnen und dann den Bildkontext während 'drawRect zu zeichnen:' –