2013-05-09 4 views
9

mi sfugge il motivo per cui questo codice, all'interno drawRect:, funziona:Perché - [UIColor setFill] funziona senza fare riferimento a un contesto di disegno?

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 

Il mio punto è, l'oggetto UIColor riceve un messaggio setFill e quindi in qualche modo lo stack capisce che questo UIColor sarà ora il colore di riempimento, isn' questo è solo strano e sbagliato? Per lo meno mi aspetterei di impostare il riempimento chiamando il metodo CGContext ... Ma ora invece di rappresentare un colore, UIColor va avanti e fa qualcosa per cambiare il contesto del mio disegno.

Qualcuno potrebbe spiegare cosa sta succedendo dietro le quinte, perché sono completamente perso qui?

Ho fatto il check out questi riferimenti prima di pubblicare:

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

risposta

12

Il mio punto è, oggetto UIColor riceve un messaggio setFill e quindi in qualche modo lo stack capisce che questo UIColor sarà ora il riempimento colore, non è solo strano e sbagliato? Per lo meno mi aspetterei di impostare il riempimento chiamando un metodo CGContext ... Ma ora invece di rappresentare un colore, UIColor continua e fa qualcosa per cambiare il contesto del mio disegno.

è perché tutto questo sta avvenendo all'interno del corrente CGContext. Questo è il motivo per cui il tuo codice funziona solo se è un CGContext corrente (ad esempio, in drawRect: o in un blocco UIGraphicsBeginImageContextWithOptions).

E probabilmente vi aiuterà molto, in questa fase del vostro studio iOS, a leggere il capitolo Disegno del mio libro: http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

+1

Grazie @ Matt gruppo, in particolare per il collegamento, sarà estremamente utile per me :) –

+1

Il tuo libro è stato davvero utile. Finalmente qualcuno ha rotto i concetti di contesti grafici e UIKit contro CoreGraphics in un modo che aveva senso! Grazie. – d512

+1

Contento di aver potuto aiutare! Anch'io ho trovato la stessa cosa confusa all'inizio, ed è per questo che ho messo così tanto impegno a spiegarlo chiaramente. – matt

6

L'attuazione di UIColor setFill viene scritto per ottenere il contesto grafico corrente e quindi impostare il colore su quel contesto attuale. In sostanza lo fa per voi:

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

Apprezzo che lo faccia, ma trovo strano che lo faccia, la dissonanza cognitiva deriva dal fatto che 'UIColor' è un oggetto' color', non un oggetto 'context'. –

+3

L'intero punto di metodi come 'setFill' deve essere una comodità quando si lavora con il contesto corrente. Osserva anche metodi come 'NSString drawAtPoint:' (un metodo di categoria di 'NSString'). È anche un metodo comodo per rendere più semplice l'uso di classi di livello superiore con l'API di grafica inferiore di livello inferiore. – rmaddy