Можно обводить произвольные пути градиентом или любым другим эффектом заливки, например шаблоном.
Как вы обнаружили, обведенные пути не отображаются с текущим градиентом. Только заполненные пути используют градиент (когда вы превращаете их в клип, а затем рисуете градиент).
Однако , в Core Graphics есть удивительно крутая процедура CGContextReplacePathWithStrokedPath
, которая преобразует путь, который вы намереваетесь штрих , в путь эквивалент при заполнении .
За кулисами CGContextReplacePathWithStrokedPath
строит многоугольник ребер вокруг вашего пути обводки и переключает его на путь, который вы определили. Я бы предположил, что ядро рендеринга Core Graphics, вероятно, делает это в любом случае в вызовах CGContextStrokePath
.
Вот документация Apple по этому вопросу:
Кварц создает обведенный путь, используя параметры текущего графического контекста. Новый путь создается таким образом, чтобы при его заполнении отображались те же пиксели, что и при обводке исходного пути. Вы можете использовать этот путь так же, как вы используете путь любого контекста. Например, вы можете привязать к заштрихованной версии пути, вызвав эту функцию с последующим вызовом функции CGContextClip.
Итак, преобразуйте ваш путь во что-то, что вы можете заполнить, превратите его в клип, и затем нарисуйте свой градиент. Эффект будет таким, как если бы вы обводили путь градиентом.
код
Это будет выглядеть примерно так ...
// Get the current graphics context.
//
const CGContextRef context = UIGraphicsGetCurrentContext();
// Define your stroked path.
//
// You can set up **anything** you like here.
//
CGContextAddRect(context, yourRectToStrokeWithAGradient);
// Set up any stroking parameters like line.
//
// I'm setting width. You could also set up a dashed stroke
// pattern, or whatever you like.
//
CGContextSetLineWidth(context, 1);
// Use the magical call.
//
// It turns your _stroked_ path in to a **fillable** one.
//
CGContextReplacePathWithStrokedPath(context);
// Use the current _fillable_ path in to define a clipping region.
//
CGContextClip(context);
// Draw the gradient.
//
// The gradient will be clipped to your original path.
// You could use other fill effects like patterns here.
//
CGContextDrawLinearGradient(
context,
yourGradient,
gradientTop,
gradientBottom,
0
);
Дополнительные примечания
Стоит подчеркнуть часть документации выше:
Кварц создает обведенный путь , используя параметры текущего графического контекста .
Очевидным параметром является ширина линии. Тем не менее, используется all состояние рисования линий, такое как рисунок обводки, ограничение угла наклона, соединения линий, ограничения, штриховые рисунки и т. Д. Это делает этот подход чрезвычайно мощным.
Для получения дополнительной информации см. этот ответ из этого S.O. вопрос .