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