2013-05-09 62 views
9

它會把我爲什麼這個代碼,裏面drawRect:,工作原理:爲什麼 - [UIColor setFill]在不參考繪圖上下文的情況下工作?

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 

我的觀點是,在UIColor對象獲得的消息setFill然後以某種方式堆棧理解這UIColor現在將填充顏色,ISN」這只是奇怪和錯誤?至少我希望通過調用一些CGContext方法來設置填充...但現在,不是代表顏色,而是繼續並且做一些事情來改變我的繪圖的上下文。

有人可以解釋幕後發生了什麼,因爲我完全迷失在這裏嗎?

我沒有在發佈前檢查這些引用:

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

回答

12

我的觀點是,的UIColor對象獲得的消息setFill然後以某種方式堆棧理解這的UIColor現在將填充顏色,這不是很奇怪嗎?至少我期望通過調用一些CGContext方法來設置填充...但現在,不是代表一種顏色,UIColor繼續並做了一些改變我的繪圖的上下文。

這是因爲所有這一切發生在當前 CGContext。這就是爲什麼你的代碼只有當當前的CGContext(例如,在drawRect:UIGraphicsBeginImageContextWithOptions塊中)時才起作用。

它可能會幫助你很多,在這個階段你的iOS學習,讀我的書的繪畫章:http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

+1

多謝@馬特,特別是對鏈接,這將是非常有用的我:) – 2013-05-09 16:41:15

+1

你的書是真的很有幫助。最後,有人以一種合理的方式分解了圖形上下文和UIKit與CoreGraphics的概念!謝謝。 – d512 2013-12-12 22:34:06

+1

很高興能幫到你!最初我也發現了同樣的事情,所以我花了很多精力來解釋清楚。 – matt 2013-12-13 00:56:53

6

UIColor setFill執行寫入來獲得當前的圖形上下文,然後設置當前上下文中的顏色。本質上,它可以實現這個要求:

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

我很欣賞它的確如此,但我覺得它很奇怪,認知失調來自這樣一個事實,即'UIColor'是一個'顏色'對象,而不是'上下文'對象。 – 2013-05-09 16:42:46

+3

像'setFill'這樣的方法,在使用當前上下文的時候很方便。另外看看'NSString drawAtPoint:'('NSString'的類別方法)這樣的方法。這也是一種方便的方法,可以使用較低級別的Core Graphics API更容易地使用更高級別的類。 – rmaddy 2013-05-09 16:46:59

相關問題