Только белый цвет заливки прозрачен в UIView - PullRequest
8 голосов
/ 18 сентября 2010

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

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

, но это

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

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

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

1 Ответ

18 голосов
/ 19 сентября 2010

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

Отредактировано, чтобы добавить:

это работает

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

но это

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...