2010-09-18 3 views
8

У меня есть UIView, который установлен в opaque = NO, и все это прекрасно работает. В drawRect я делаю пользовательский рисунок, и это работаетТолько белый цвет заливки прозрачен в UIView

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

но это

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

приводит к NO заливки производится (вы даже можете увидеть другие вещи, которые я опиралась на CGContext через него). Как я могу нарисовать белую заливку?

Примечание: Если я установил элемент управления, который не будет непрозрачным, он все равно не работает.

ответ

17

Почему бы не использовать CGContextSetFillColorWithColor? Затем вы можете передать объект CGColor напрямую, а не извлекать его компоненты и предполагать, что он находится в том же цветовом пространстве, что и контекст.

Edited добавить:

это работает

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

, но это

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

приводит к NO заливкой производится (вы даже можете увидеть другие вещи, которые я опиралась на CGContext через него).

Как я уже упоминал, этот способ установки цвета заливки предполагает, что цвет находится в том же цветовом пространстве, что и контекст.

Обычно большинство CGContexts находятся в цветовом пространстве RGB. whiteColor, с другой стороны, почти наверняка находится в белом цветовом пространстве, в котором есть только один или два (белый и альфа) компоненты.

Итак, поскольку контекст находится в цветовом пространстве RGB, CGContextSetFillColor ожидает передачи трех или четырех (красных, зеленых, синих и альфа) компонентов. Когда вы получаете компоненты CGColor whiteColor, вы получаете указатель на массив C, содержащий только два компонента. CGContextSetFillColor будет читать три или четыре компонента, которые он хочет, независимо от того, что; если вы пройдете меньше, он может найти мусор после них, или он может найти нули.

Если он находит нуль в альфа-позиции, то результатом является то, что вы установили цвет заливки на что-то между желтым (красный = 1,0, зеленый = 1,0, синий = 0,0) и белый (все три = 1,0) с нулевой альфа. Вот почему заполнитель не появляется: вы заполняетесь прозрачным цветом.

Проблема заключается в том, что несоответствие между пространством цвета, в котором находится контекст (с тремя или четырьмя компонентами) и цветовым пространством, в котором находится цвет (с одним или двумя компонентами). Решение состоит в том, чтобы удалить несоответствие, что и делает CGContextSetFillColorWithColor: Поскольку вы передаете весь объект CGColor, а не только массив чисел, Core Graphics сможет установить цветовое пространство контекста по отношению к цветному объекту и интерпретировать цветных объектов.

+2

Awesome, спасибо! 'CGContextSetFillColorWithColor (контекст, [UIColor whiteColor] .CGColor);' –

+0

отличное объяснение спасибо –

+0

Отличное объяснение, очень удобно. – CVertex

Смежные вопросы