Как я добавил одну кнопку и отрефакторил половину проекта
Это история добавления кнопки в приложение, над которым я сейчас работаю. Мой предыдущий пост был о добавлении элемента управления выбора в том же приложении.
Итак, приложение очень простое, но оно полно настраиваемых визуальных эффектов, реализация которых занимает больше всего времени.
Моя цель — кнопка Пуск. Его цвет меняется в зависимости от выбранных значений средств выбора выше. Между цветами элементов выбора и кнопки Старт должна быть связь, чтобы они хорошо смотрелись вместе на одном экране, но пока неясно, как этого добиться.
Я начал с двух сборщиков. Я знал их выбранные цвета, и моей первой мыслью было взять среднее значение в RGB. Это просто, у меня уже были все необходимые занятия. Чтобы не писать лишний код, я взял градиент от верхнего цвета к нижнему и попросил центральную точку.
Результат разочаровал... При некоторых значениях кнопка становилась серой!
Оказывается, мой код для рисования градиента с цветами RGB не так уж и хорош. Раньше этого не было заметно, когда цвета были близки друг к другу, но если я попробую нарисовать градиент от зеленого к розовому, например, то у меня получится вот что:
Хорошо, какие еще у нас есть варианты? После небольшого исследования того, как работают цветовые пространства, я решил перенести все на HSB. HSB — это еще одно представление цветового пространства RGB.
Выбор среднего значения для hue всегда должен приводить к приятному яркому цвету. Решил сразу сделать рефакторинг и проверить.
Вау, это выглядит немного токсично, но почему? Самое время открыть графический редактор и проверить, как там создаются градиенты. Себе на заметку: в следующий раз сначала проверяй, а потом внедряй.
Итак, мне нужно уменьшить насыщенность и яркость в центральной точке. Немного экспериментов и результат выглядит приемлемым.
Но дизайнер все еще недоволен! Что это за синий цвет, спрашивает он, откуда он взялся?
Что есть, то есть. Изменение значения оттенка всегда приводит к красивому яркому цвету, но этот цвет не имеет ничего общего с начальной и конечной точками. Модель HSB не сработала. Я все же оставил его, потому что мне нравится, как строятся новые градиенты. Но для кнопки запуска нам нужно что-то другое.
Рефакторинг половины приложения оказался слишком трудоемким, поэтому я сделал небольшую площадку для экспериментов с цветами вместе с дизайнером. Заметка для себя: в следующий раз сделайте это перед реализацией,
Новое решение — использовать режим наложения снова.
Моя текущая реализация кнопки была основана на простых CALayers, мне нужно было переписать с помощью draw(_ rect:). Легкий.
В качестве базового цвета я взял значение палитры repeats и значение seconds, добавленное к интенсивности цвета.
Сделанный.
Подожди секунду! Что это за странное свечение на границе? Неприемлемо!
Я не мог избавиться от него полностью и в какой-то момент сдался и снова провел рефакторинг кнопки, на этот раз используя комбинацию draw(_ rect:) и masks.
Было много рефакторинга, экспериментов и выбрасывания кода ради одной кнопки. Несколько лет назад я бы счел это разочаровывающим, теперь я думаю, что это все самое интересное!
"Предыдущий пост"