2013-05-09 21 views
9

Nó thoát tôi tại sao mã này, bên drawRect:, hoạt động:Tại sao - [UIColor setFill] làm việc mà không đề cập đến một bối cảnh vẽ?

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 

Quan điểm của tôi là, đối tượng UIColor nhận được một thông điệp setFill và sau đó bằng cách nào đó chồng hiểu rằng UIColor này ngay bây giờ sẽ là màu fill, isn' điều này thật lạ và sai? Ít nhất tôi sẽ mong đợi thiết lập điền bằng cách gọi một số phương pháp CGContext ... Nhưng bây giờ thay vì đại diện cho một màu, UIColor tiếp tục và làm một cái gì đó để thay đổi bối cảnh của bản vẽ của tôi.

Ai đó có thể giải thích những gì đang diễn ra đằng sau hậu trường, bởi vì tôi hoàn toàn bị mất ở đây?

tôi đã kiểm tra các tài liệu tham khảo trước khi gửi bài:

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

Trả lời

12

Quan điểm của tôi là, UIColor đối tượng nhận được một thông điệp setFill và sau đó bằng cách nào đó chồng hiểu rằng giờ đây UIColor này sẽ được điền màu sắc, không phải là điều này chỉ là lạ và sai? Ít nhất tôi sẽ mong đợi thiết lập điền bằng cách gọi một số phương pháp CGContext ... Nhưng bây giờ thay vì đại diện cho một màu sắc, UIColor đi vào và làm một cái gì đó để thay đổi bối cảnh của bản vẽ của tôi.

Đó là vì tất cả điều này diễn ra trong hiện tại CGContext. Đó là lý do tại sao mã của bạn chỉ hoạt động nếu có CGContext hiện tại (như có, ví dụ: trong drawRect: hoặc trong khối UIGraphicsBeginImageContextWithOptions).

Nó có thể sẽ giúp bạn rất nhiều, ở giai đoạn này của cuộc nghiên cứu iOS của bạn, để đọc các chương Vẽ của cuốn sách của tôi: http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

+1

Cảm ơn @ Matt bó, đặc biệt đối với các liên kết, nó sẽ vô cùng hữu ích cho tôi :) –

+1

cuốn sách của bạn là thực sự hữu ích. Cuối cùng, ai đó đã phá vỡ các khái niệm về ngữ cảnh đồ họa và UIKit so với CoreGraphics theo cách có ý nghĩa! Cảm ơn. – d512

+1

Vui vì tôi có thể giúp! Tôi cũng thấy điều tương tự khó hiểu lúc đầu, và đó là lý do tại sao tôi đã nỗ lực rất nhiều để giải thích rõ ràng. – matt

6

Việc thực hiện UIColor setFill được viết để có được bối cảnh đồ họa hiện tại và sau đó để thiết lập màu sắc trên bối cảnh hiện tại. Về cơ bản nó thực hiện điều này cho bạn:

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

Tôi đánh giá cao rằng nó làm điều đó, nhưng tôi thấy nó Lạ lùng như vậy, sự bất hòa nhận thức xuất phát từ thực tế là 'UIColor' là một đối tượng' màu', không phải là một đối tượng 'bối cảnh'. –

+3

Toàn bộ các phương thức như 'setFill' là một sự thuận tiện khi làm việc với ngữ cảnh hiện tại. Ngoài ra, hãy xem các phương thức như 'NSString drawAtPoint:' (một phương thức danh mục 'NSString'). Đây cũng là một phương pháp tiện lợi để giúp dễ dàng sử dụng các lớp cấp cao hơn với API đồ họa cốt lõi cấp thấp hơn. – rmaddy

Các vấn đề liên quan