Почему бы не использовать 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 сможет установить цветовое пространство контекста по отношению к цветному объекту и интерпретировать цветных объектов.
Awesome, спасибо! 'CGContextSetFillColorWithColor (контекст, [UIColor whiteColor] .CGColor);' –
отличное объяснение спасибо –
Отличное объяснение, очень удобно. – CVertex