Почему бы не использовать 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 сможет установить цветовое пространство контекста равным цветовому пространству объекта и правильно интерпретировать компоненты цветного объекта.