2013-05-09 7 views
9

Es entgeht mir, warum dieser Code innerhalb drawRect: arbeitet:Warum funktioniert - [UIColor setFill] ohne Bezug auf einen Zeichnungskontext?

UIBezierPath *buildingFloor = [[UIBezierPath alloc] init]; 
// draw the shape with addLineToPoint 
[[UIColor colorWithRed:1 green:0 blue:0 alpha:1.0] setFill]; // I'm sending setFill to UIColor object? 
[buildingFloor fill]; // Fills it with the current fill color 

Mein Punkt ist, erhält der UIColor Objekt eine Nachricht setFill und dann irgendwie der Stapel versteht, dass dies UIColor jetzt die Füllfarbe wird, isn‘ t das nur komisch und falsch? Zumindest würde ich erwarten, füllen durch das Aufrufen von einigen CGContext Methode ... Aber jetzt statt eine Farbe, UIColor geht weiter und tut etwas, um den Kontext meiner Zeichnung zu ändern.

Könnte jemand erklären, was hinter den Kulissen passiert, weil ich hier total verloren bin?

Ich habe diese Referenzen überprüfen vor der Veröffentlichung:

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIColor_Class/Reference/Reference.html http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html

Antwort

12

Mein Punkt ist, bekommt UIColor Objekt eine Nachricht setFill und dann irgendwie der Stapel versteht, dass dies UIColor wird nun die Füllung sein Farbe, ist das nicht nur komisch und falsch? Zumindest würde ich erwarten, die Füllung durch Aufruf einer CGContext-Methode einzustellen ... Aber jetzt, anstatt eine Farbe darzustellen, geht UIColor weiter und macht etwas, um den Kontext meiner Zeichnung zu ändern.

Es ist, weil all dies innerhalb der aktuellen Aufnahme wird CGContext. Deshalb funktioniert Ihr Code nur dann, wenn ein aktueller CGContext ist (wie es zB in drawRect: oder in einem UIGraphicsBeginImageContextWithOptions Block ist).

Es wird Sie wahrscheinlich eine Menge helfen, in diesem Stadium der iOS-Studie, die Zeichnung Kapitel meines Buches zu lesen: http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

+1

Dank einem Haufen @ Matt, vor allem für den Link, wird es für mich sehr nützlich sein :) –

+1

Ihr Buch wirklich hilfreich war. Schließlich hat jemand die Konzepte von grafischen Kontexten und UIKit vs. CoreGraphics in einer Weise gebrochen, die Sinn ergab! Vielen Dank. – d512

+1

Ich bin froh, dass ich helfen konnte! Ich fand das gleiche auch zunächst verwirrend, und deshalb habe ich mich sehr bemüht, es klar zu erklären. – matt

6

Die Implementierung von UIColor setFill geschrieben wird, um die aktuellen Grafikkontext zu bekommen und dann zu setzen die Farbe in diesem aktuellen Kontext. Im Grunde tut es dies für Sie:

UIColor *color = ... // some color 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextSetFillColorWithColor(ctx, color.CGColor); 
+0

Ich weiß, dass es das tut, aber ich finde es komisch, dass es so ist, die kognitive Dissonanz kommt von der Tatsache, dass "UIColor" ein "Farb" -Objekt ist, kein "Kontext" -Objekt. –

+3

Der ganze Sinn von Methoden wie 'setFill' ist Bequemlichkeit beim Arbeiten mit dem aktuellen Kontext. Sehen Sie sich auch Methoden wie 'NSString drawAtPoint:' an (eine Kategoriemethode von 'NSString'). Es ist auch eine bequeme Methode, um die Verwendung von Klassen höherer Ebene mit der Core Graphics-API der unteren Ebene zu vereinfachen. – rmaddy

Verwandte Themen