Можно обводить произвольные контуры градиентом или любым другим эффектом заливки, например узором.
Как вы обнаружили, обведенные контуры не отображаются с текущим градиентом. Только контуры с заливкой используют градиент (когда вы превращаете их в клип, а затем рисуете градиент).
Однако в Core Graphics есть удивительно крутая процедура CGContextReplacePathWithStrokedPath
, которая преобразует путь, который вы собираетесь обводить, в путь, который эквивалентен при заполнении.
За кулисами CGContextReplacePathWithStrokedPath
строит краевой многоугольник вокруг вашего пути обводки и переключает его на путь, который вы определили. Я предполагаю, что движок рендеринга Core Graphics, вероятно, делает это в любом случае при вызовах CGContextStrokePath
.
Вот документация Apple по этому поводу:
Quartz создает контур с обводкой, используя параметры текущего графического контекста. Новый контур создается таким образом, что при заливке рисуются те же пиксели, что и при обводке исходного контура. Вы можете использовать этот путь так же, как и путь любого контекста. Например, вы можете обрезать контурную версию пути, вызвав эту функцию с последующим вызовом функции 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
);
Дальнейшие примечания
Стоит выделить часть документации выше:
Кварц создает контур с обводкой, используя параметры текущего графического контекста.
Очевидный параметр - ширина линии. Однако используется состояние прорисовки всех линий, таких как образец штрихов, ограничение угла наклона, соединения линий, заглавные буквы, образцы штрихов и т. Д. Это делает подход чрезвычайно эффективным.
Дополнительные сведения см. В этом ответе в это ТАК вопрос.
person
Benjohn
schedule
30.07.2014