Я искал возможность превратить любой UIColor в градиент. Я собираюсь сделать это, используя Core Graphics для рисования градиента. Я пытаюсь получить цвет, скажем так:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
и получите UIColor, который на несколько оттенков темнее, а несколько оттенков светлее. Кто-нибудь знает как это сделать? Спасибо.
objective-c
ios
core-graphics
gradient
uicolor
CoreCode
источник
источник
Ответы:
Используйте это так:
РЕДАКТИРОВАТЬ : как @Anchu Chimala указал, для максимальной гибкости, эти методы должны быть реализованы как категория UIColor. Кроме того, исходя из идеи @Riley, может быть, лучше сделать цвет пропорционально темнее или светлее, чем добавлять или вычитать постоянные значения. Как указал @jrturton, нет необходимости манипулировать компонентами RGB; Лучше изменить само свойство яркости. В целом:
источник
getHue:saturation:brightness
подпись UIKit, похоже, что он работает с HSV вместо HSB. Изменение яркости (так на самом деле значение) в этом контексте не будет работать. Например, чистый красный (rgb (255,0,0)) будет иметь яркость / значение 1, что делает невозможным освещение через яркость. Я закончил работать с изменениями значений RGB.getHue:saturation:brightness:alpha
вернет ЛОЖЬ.luminance
значение цветового пространства LAB - это то, о чем вы должны заботиться, делая цвета светлее / темнее. Посмотрите мой ответ о том, как вы можете использовать его и правильно решить эту проблему.TL; DR:
Swift:
Использование:
Objective-C:
@rchampourlier был прав в своем комментарии к @ user529758 (принятый ответ) - решения HSB (или HSV) и RGB дают совершенно разные результаты. RGB просто добавляет (или делает цвет ближе к) белому, а решение HSB приближает цвет к краю в шкале яркости - которая в основном начинается с черного и заканчивается чистым цветом ...
В основном яркость (значение) делает цвет менее или более близким к черному, а насыщенность делает его более или менее приближенным к белому ...
Как видно здесь:
Таким образом, решение , чтобы сделать цвет на самом деле ярче (т.е. ближе к белому ...) будет сделать это значение насыщенности меньше , в результате этого решения:
источник
Swift универсальное расширение для iOS и OS X , используя getHue :
Использование :
ИЛИ (со значениями по умолчанию):
Образец :
источник
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
и затем заменивgetHue
вызов на цветной вызов:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
перед словом количество. Должно бытьprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Я просто хотел дать тот же результат, в RGB, чем
Что дает тот же результат, AFAIK, что и выбор цвета с градиентом «цвет к белому» или «цвет к черному» при x% от размера градиента.
Для этого математика проста:
Вот примеры с некоторыми цветами
источник
Решение user529758 в Swift:
Темный цвет:
Более светлый цвет:
источник
var darker: UIColor
например.Если вы преобразуете цвет RGB в цветовую модель HSL, вы можете изменить компонент L = lightness от L = 0.0 (черный) до L = 0.5 (естественный цвет) до L = 1.0 (белый).
UIColor
не может обрабатывать HSL напрямую, но есть формула для преобразования RGB <-> HSL.источник
Ни одно из опубликованных решений не работало для всех цветов и оттенков, но потом я наткнулся на эту библиотеку, которая предоставляет набор очень хорошо реализованных расширений для UIColor.
В частности, он имеет функцию облегчения как часть своей реализации HSL:
(UIColor *)lighten:(CGFloat)amount
- которая работает отлично.источник
Sebyddd
Решение как расширение:Использование:
источник
Если вы хотите, чтобы решение user529758 работало с серыми оттенками (например,
[UIColor lightGrayColor]
или[UIColor darkGrayColor]
вы должны улучшить его так:getHue:saturation:brightness:alpha
дает сбой (и возвращаетfalse
) при вызове на сером оттенке, поэтому вам нужно использоватьgetWhite:alpha
.источник
UIColor расширение и фиксация легчеColorForColor
источник
Все остальные ответы в этой теме используют либо цветовую систему RGB, либо просто меняют значение оттенка или яркости системы HSB . Как было подробно разъяснено в этом большом блоге опубликовать на правильный способ сделать цвет светлее или темнее , чтобы изменить его
luminance
значение. Ни один из других ответов не делает этого. Если вы хотите сделать это правильно, то воспользуйтесь моим решением или напишите свое собственное после прочтения поста в блоге.К сожалению, довольно сложно изменить любой из атрибутов UIColor по умолчанию . Кроме того, Apple даже не поддерживает какое-либо цветовое пространство на
UIColor
основеL
LAB, такое как HCL, в классе (значение в LAB - этоluminance
значение, которое мы ищем).Использование HandyUIKit (установите его через Carthage) добавляет поддержку HCL и делает вашу жизнь намного проще :
Существует также возможность применить относительное изменение (рекомендуется):
Обратите внимание, что HandyUIKit также добавляет некоторые другие удобные функции пользовательского интерфейса в ваш проект - за подробностями обращайтесь к его README на GitHub .
Я надеюсь, что это помогает!
источник
Я не уверен, что вы ищете какой-то ответ Objective-C, но исходя из того, как работают цвета, заданные RGBA, я думаю, что вы можете просто масштабировать значения RGB в соответствии с произвольным фактором, чтобы получить «светлее» или более темный оттенок Например, у вас может быть синий:
Хотите темно-синий? Умножьте значения RGB на 0,9:
Вуаля. Или, может быть, у вас есть апельсин:
Выберите другой масштабный коэффициент, скажем, 0,8:
Это тот эффект, который вы ищете?
источник
Протестировано в Xcode 10 с Swift 4.x для iOS 12
Начните с вашего цвета как UIColor и выберите фактор затемнения (как CGFloat)
Тип CGColor имеет необязательное значение,
components
которое разбивает цвет на RGBA (как массив CGFloat со значениями от 0 до 1). Затем вы можете восстановить UIColor, используя значения RGBA, взятые из CGColor, и манипулировать ими.В этом примере каждое значение RGB было разделено на 2, в результате чего цвет стал наполовину таким же темным, как и раньше. Значение альфа-канала осталось прежним, но вы можете альтернативно применить фактор затемнения к значению альфа-канала, а не к RGB.
источник
Swift 5
источник
В идеале, функции должны быть инкапсулированы внутри
UIColor
вызываемого расширенияUIColor+Brightness.swift
и иметь настраиваемую яркость - см. Пример ниже:источник
Я отображаю цветные ячейки на основе значения статуса:
Для этого я написал быстрое расширение, основанное на некотором старом objc-коде, после того как я получил ошибку, используя предложение CryingHippo:
То же самое работает для
NSColor
. Просто заменитеUIColor
наNSColor
.источник
Вот категория UIColor, которая также позволяет контролировать степень изменения цвета.
источник
Расширение Swift, основанное на ответе @Sebyddd:
источник
для более темного цвета это самое простое: theColor = [theColor shadowWithLevel: s]; //s:0.0 до 1.0
источник