2009-05-25 2 views
2

Ich bin ein absoluter Neuling für XCode, also habe ich die Lernkurve von Quartz2D absolviert. Ich verstehe, dass die drawRect-Methode einer Ansicht immer dann aufgerufen wird, wenn eine Aktualisierung der Grafiken der Ansicht erforderlich ist und die setNeedsDisplay-Methode ein Neuzeichnen aktiviert.Wie verbinde ich eine Ansicht mit dem Grafikkontext?

Aber was ich nicht finden kann, ist eine klare Erklärung der Beziehung zwischen dem Grafikkontext und einer bestimmten Ansicht. Der Grafikkontext selbst ist offenbar keine Instanzvariable der Ansicht. Wenn ich also eine Ansicht modifizieren und einen komplexen Pfad mit den CGContext ... -Methoden erstellen möchte, welchen Code brauche ich, um diesen Grafikkontext mit der Ansicht I zu verknüpfen Möchten ändern?

Vielen Dank im Voraus für jede Anleitung zu dieser Frage.

jrdoner

+0

Xcode ist die IDE, es hat nichts mit den Frameworks Sie zu tun verwenden Sie können den Aufstieg Quartz 2D-Lernkurve mit vim/emacs und make, wenn man möchte (obwohl auf dem Gerät laufen würde schwierig) –

+0

Es würde wahrscheinlich helfen, wenn Sie klar machen könnten, ob diese Frage auf Cocoa (Mac) oder Cocoa Touch (iPhone gerichtet ist) –

Antwort

3

Sie können einen Grafikkontext erstellen, aber das nur in komplexen Zeichnung operation.For den meisten Fällen ist es für Sie getan benötigt wird. Sie müssen nur den Kontext abrufen, indem Sie UIGraphicsGetCurrentContext() aufrufen.

Wenn das Framework festlegt, dass eine Ansicht neu gezeichnet werden muss (aus verschiedenen Gründen, z. B. setNeedsDisplay:), generiert (oder wiederherstellt) es einen Grafikkontext für diese Ansicht und macht sie zur aktuellen Ansicht Kontext vor dem Aufruf -drawRect:. Ihre Aufgabe besteht darin, in dem Kontext zu zeichnen, in dem Sie bereitgestellt wurden. Danach ist es das Problem des Frameworks, den resultierenden Kontext zu trennen, ihn mit anderen Kontexten zu mischen und schließlich in den Bildschirmspeicher zu zeichnen.

Tun Sie ein wenig vorsichtig, zu viel komplexe Zeichnung in -drawRect: zu tun, wenn Sie es helfen können. Das iPhone hat nicht annähernd so viel CPU wie ein Desktop-Computer, und es wird empfohlen, dass Sie den Großteil Ihrer Zeichenarbeit mit Bildern anstatt mit Pfaden erledigen. Apple hat sogar viele der bequemeren Zeichnungs-Wrapper von Mac entfernt, die Entwickler absichtlich davon abhalten, Core Graphics zu sehr zu verwenden.

+0

Gute Antwort, was sagst du dazu? komplexe Zeichnung in drawRect: is ist sehr interessant, und ich würde gerne mehr lesen. Kennen Sie eine offizielle Apple-Dokumentation (oder eine andere Diskussion) zum Thema Laden von Bildern über programmatische Zeichnungen? – erikprice

+0

Als nächstes wäre das Schreiben von programmatisch gezeichnetem Inhalt in einen CGLayer (anstatt wiederholt in drawRect: neu zu zeichnen) eine akzeptable Alternative zum Laden und Bearbeiten von Bildern? – erikprice

+0

In Bezug auf Apples Empfehlungen, sind diese von meinen WWDC-Notizen, wo sie diskutiert, warum sie gestreckte Bilder mit Endkappen gegen Farbverläufe auf Schaltflächen wollte. Es scheint keine "Drawing Performance Guidelines" für das iPhone zu geben. Während meine Notizen aus 2008 Sitzungen stammen, empfehle ich WWDC 2009 Session # 132 (iPhone Ansichten und Animationen), wenn Sie Zugriff haben. Was GCLayer gegenüber drawRect angeht: Der Punkt ist, dass CGGradient und CGPath CPU-teuer sind, was Batterie-teuer bedeutet. Also sollten wir sie vermeiden, wenn es praktisch ist. Sie sind natürlich nicht verboten: D –

1

Ich nehme an, dass Sie Ihren Pfad innerhalb -(void)drawRect:(CGRect)rect Methode Ihrer UIView Unterklasse erstellen.

Innen drawRect Sie können den Zugriff auf grafische Kontext erhalten durch den Aufruf (CGContextRef)UIGraphicsGetCurrentContext(void);

Beispiel from lecture 5 cs193p.

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [[UIColor grayColor] set]; 
    UIRectFill ([self bounds]); 
    CGContextBeginPath (context); 
    CGContextMoveToPoint (context, 75, 10); 
    CGContextAddLineToPoint (context, 10, 150); 
    CGContextAddLineToPoint (context, 160, 150); 
    CGContextClosePath (context); 
    [[UIColor redColor] setFill]; 
    [[UIColor blackColor] setStroke]; 
    CGContextDrawPath (context, kCGPathFillStroke); 
}