Я пытаюсь скосить пути в основной графике. Кто-нибудь уже сделал это для произвольных форм, и если да, то готовы ли они поделиться кодом?
Я включил свою реализацию ниже. Я использую три переменные для определения скоса: CGFloat bevelSize
, UIColor highlightColor
, UIColor shadow
. Обратите внимание, что угол источника света всегда равен 135 градусам. Я еще не закончил это реализовывать, но вот, по сути, то, что я пытаюсь сделать, разбитое на две части. Часть первая, создайте фокусы:
- Я нахожу биссектрисы углов между соседними линиями пути.
- Для дуг биссектриса — это линия, перпендикулярная линии, созданной двумя конечными точками дуги, начинающейся из средней точки. Это должно позаботиться о большинстве ситуаций, в которых используется дуга. Я не беру биссектрису дуги и прямой. В этих случаях биссектриса дуги должна работать нормально.
- Затем я вычисляю фокальные точки на основе пересечения каждой соседней биссектрисы.
- Если фокальная точка находится внутри формы, она используется, в противном случае она отбрасывается.
Цель создания фокусных точек — пропорционально «сжать» форму.
Вторая часть немного сложнее. Мне необходимо создать каждую сторону/сегмент скошенной формы. Я делаю это, рисуя «в» (с помощью bevelSize
) каждую точку исходной формы по радиусу линии, которая проходит от ближайшего фокуса к рассматриваемой точке. Когда у меня есть два последовательных «bevelPoints», я создаю UIBezierPath, который простирается от bevelPoints до исходных точек и обратно до bevelPoints (обратите внимание, это включает дуги). Это создает «сторону/сегмент», который я могу использовать для заполнения. На прямых сторонах я просто заливаю либо тенью, либо цветом блика, в зависимости от угла стороны. Для дуг я определяю «дугу» в радианах. Если эта дуга содержит угол перехода (M_PI_4 или M_PI + M_PI_4), я заполняю ее градиентом (от тени к блику или от блика к тени, в зависимости от того, что подходит). В противном случае я заполняю его сплошным цветом.
Обновить
Я выделил свой ответ (см. ниже) в отдельный пост в блоге. Я больше не использую детали реализации, которые вы видите выше, но оставлю их для справки. Я надеюсь, что это поможет всем, кто хочет использовать Core Graphics.