2009-08-09 10 views
3

Ich mache ein einfaches iPhone Zeichenprogramm als persönliches Nebenprojekt.Einfache iPhone Zeichnungs App mit Quartz 2D

Ich erfassen berührt Ereignis in einer Unterklasse UIView und rendern die tatsächlichen Sachen zu einem separaten CGLayer. Nach jedem Rendern rufe ich [self setNeedsLayout] auf und in der drawRect: Methode zeichne ich den CGLayer auf den Bildschirmkontext.

Das alles funktioniert gut und funktioniert gut zum Zeichnen von Rechtecken. Ich möchte jedoch nur einen einfachen "Freihand" -Modus wie viele andere iPhone-Anwendungen haben.

Die Art, wie ich dachte, dies zu tun war eine CGMutablePath, zu erstellen und einfach:

 
CGMutablePathRef path; 
-(void)touchBegan { 
    path = CGMutablePathCreate(); 
} 
-(void)touchMoved { 
    CGPathMoveToPoint(path,NULL,x,y); 
    CGPathAddLineToPoint(path,NULL,x,y); 

} 
-(void)drawRect:(CGContextRef)context { 
     CGContextBeginPath(context); 
     CGContextAddPath(context,path); 
     CGContextStrokePath(context); 
} 

jedoch nach mehr als 1 Sekunde Zeichnung, Performance kläglich abbaut.

Ich würde nur jede Zeile in den Off-Screen-CGLayer zeichnen, wenn es nicht für variable Opazität wäre! Die Opazität von weniger als 100% bewirkt, dass Punkte auf dem Bildschirm verbleiben, der die Linien verbindet. Ich habe CGContextSetBlendingMode() angesehen, aber leider kann ich keine Antwort finden.

Kann mir jemand in die richtige Richtung zeigen? Andere iPhone Apps können dies mit sehr guter Effizienz tun.

Antwort

1

Das Problem ist, dass mit CGStrokePath() der aktuelle veränderbare Pfad geschlossen und gezeichnet wird und ein neuer Pfad erstellt wird, wenn Sie Ihren Finger bewegen. Sie haben also wahrscheinlich viele Pfade für eine "Sitzung", zumindest scheint das Ihr Pseudocode zu sein.

Sie können versuchen, einen neuen veränderbaren Pfad zu beginnen, wenn Berührungen beginnen, verwenden Sie CGAddLineToPoint(), wenn die Berührungen den Pfad verschieben und beenden, wenn er berührt (ähnlich wie Ihr Pseudocode zeigt). Aber in der Draw-Methode zeichnen Sie eine Kopie des aktuellen veränderbaren Pfades, und der tatsächliche veränderbare Pfad wird immer noch verlängert, bis die Berührungen enden, sodass Sie nur einen Pfad für die gesamte Berührungssitzung erhalten. Nachdem die Berührungen beendet sind, können Sie den Pfad permanent hinzufügen - Sie können zum Beispiel alle Pfade in ein Array einfügen und über sie in der Zeichenmethode iterieren.

1

Was SanHolo gesagt hat - und Sie möchten vielleicht das Hinzufügen von Punkten drosseln, so dass es nur einen neuen Punkt hinzufügt, nicht öfter als alle 10ms, sagen Sie (Sie müssten mit dem Intervall spielen). Sie können das mit einem einfachen Timer machen.

Wie weisen Sie die Ansicht an, dass sie sich neu zeichnen muss? Vielleicht möchtest du das auch drosseln - und es könnte ein längeres Intervall sein als das Punkt-Capturing (zB Capture-Punkte nicht mehr als alle 10ms und neuzeichnen nicht öfter als alle 200ms - wieder musst du mit den Zahlen spielen) .

In beiden Fällen müssen Sie sicherstellen, dass, wenn nichts länger als das Intervall passiert, dass der letzte Punkt erfasst wird oder das Neuzeichnen angefordert wird. Hier kommt der Timer ins Spiel.

Verwandte Themen