Можно погладить произвольные пути с градиентом или любым другим эффектом заливки, таким как узор.
Как вы нашли, поглаженные пути не отображаются с текущим градиентом. Только заполненные пути используют градиент (когда вы поворачиваете их в клип, а затем нарисуете градиент).
Однако, 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
);
Дальнейшие заметки
Стоит подчеркнуть часть вышеуказанной документации:
Quartz создает погладил путь с использованием параметров текущего графического контекста.
Очевидным параметром является ширина линии. Тем не менее, все используется в качестве чертежного состояния линии, например, шаблон хода, предел митры, линейные соединения, колпачки, тире и т. Д. Это делает этот подход чрезвычайно мощным.
Для получения дополнительной информации см. this answer of this S.O. question.
Быстрая заметка - выбранный здесь ответ неверен. ** Можно пропустить произвольные пути с градиентом **, как показывает [этот ответ] (http://stackoverflow.com/a/25034854/2547229). – Benjohn