2010-09-18 56 views
8

Tôi có một số UIView được đặt thành opaque = NO và tất cả đều hoạt động độc đáo. Trong drawRect tôi đang làm bản vẽ tùy chỉnh, và các công trình nàyChỉ màu tô màu trắng trong suốt ở UIView

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

nhưng điều này

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

kết quả trong NO điền được sản xuất (thậm chí bạn có thể xem công cụ khác mà tôi đã thu hút trên CGContext qua nó). Làm thế nào tôi có thể vẽ một màu trắng?

Lưu ý: Nếu tôi đặt điều khiển không bị mờ, nó vẫn không hoạt động.

Trả lời

17

Tại sao không sử dụng CGContextSetFillColorWithColor? Sau đó, bạn có thể chuyển đối tượng CGColor trực tiếp thay vì trích xuất các thành phần của nó và giả sử nó nằm trong cùng một không gian màu như ngữ cảnh.

Edited thêm:

làm việc này

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 

nhưng điều này

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 

kết quả trong NO điền được sản xuất (thậm chí bạn có thể xem công cụ khác mà tôi đã thu hút trên CGContext thông qua nó).

Như tôi đã đề cập, cách cài đặt màu này giả định rằng màu sắc có cùng không gian màu như ngữ cảnh.

Thông thường, hầu hết CGContexts đều nằm trong không gian màu RGB. whiteColor, mặt khác, gần như chắc chắn trong một không gian màu trắng, chỉ có một hoặc hai thành phần (trắng và alpha).

Vì vậy, vì ngữ cảnh nằm trong không gian màu RGB, CGContextSetFillColor dự kiến ​​sẽ được chuyển qua ba hoặc bốn thành phần (đỏ, lục, lam và alpha). Khi bạn nhận được các thành phần của CGColor của whiteColor, bạn sẽ nhận được một con trỏ tới một mảng C chỉ giữ hai thành phần. CGContextSetFillColor sẽ đọc ba hoặc bốn thành phần nó muốn không có vấn đề gì; nếu bạn vượt qua ít hơn, nó có thể tìm thấy rác sau khi họ, hoặc nó có thể tìm thấy số không.

Nếu tìm thấy số không ở vị trí alpha, thì kết quả là bạn đã đặt màu tô thành màu vàng (đỏ = 1,0, xanh = 1,0, xanh = 0,0) và trắng (tất cả ba = 1,0) với số không alpha. Đó là những gì làm cho điền để không hiển thị: Bạn đang làm đầy với một màu trong suốt.

Vấn đề là không khớp giữa không gian màu trong ngữ cảnh (với ba hoặc bốn thành phần) và không gian màu có màu (với một hoặc hai thành phần). Giải pháp là loại bỏ sự không khớp, đó là những gì CGContextSetFillColorWithColor thực hiện: Vì bạn đang truyền toàn bộ đối tượng CGColor, không chỉ là một dãy số, Đồ họa cốt lõi sẽ có thể thiết lập không gian màu của bối cảnh cho đối tượng màu và giải thích các thành phần của đối tượng màu sắc chính xác.

+2

Tuyệt vời, cảm ơn! 'CGContextSetFillColorWithColor (ngữ cảnh, [UIColor whiteColor] .CGColor);' –

+0

giải thích tuyệt vời nhờ –

+0

Giải thích tuyệt vời, rất tiện dụng. – CVertex

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