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?
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. " –
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. –
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:' –