На OSX, как мне градиент заполнить ход пути?
Используя множество функций рисования в Cocoa или Кварце, довольно легко рисовать контуры и заполнять их, используя градиент. Я не могу найти приемлемый способ, однако, чтобы "обвести" -draw путь с шириной линии в несколько пикселей и заполнить этот штрих, используя градиент. Как это сделать?
Изменение: видимо вопрос не был достаточно ясным. Спасибо за ответы, но я уже понял это. Что я хочу сделать, это:
(источник: emle.nl)
Левый квадрат - это NSGradient, нарисованный в пути, за которым следует сообщение об обводке пути. Право - это то, что я хочу сделать; Я хочу заполнить обводку с помощью градиента.
Ответы
Ответ 1
Если вы преобразуете NSBezierPath
в CGPath
, вы можете использовать метод CGContextReplacePathWithStrokedPath()
для извлечения пути, который является контуром поглаженного пути. Graham Cox отлично GCDrawKit имеет метод -strokedPath
категории NSBezierPath
, который сделает это для вас без необходимости перейдите к Core Graphics.
Как только у вас есть выделенный путь, вы можете заполнить этот путь с помощью NSGradient
.
Ответ 2
Я не могу найти приемлемый способ, однако, "погладить" - нарисуйте путь с шириной линии в несколько пикселей и заполните этот штрих, используя градиент. Как это делается?
[Исходный ответ заменен следующим]
А, я вижу. Вы хотите применить градиент к штриху.
Для этого вы используете режим наложения. Я объяснил, как это сделать в ответе на еще один вопрос. Вот список шагов, адаптированных к вашей цели:
Ответ 3
По словам Питера Хоуси, мне удалось сделать простую градиентную кривую, которая выглядит так:
![Изображение кривой градиента]()
Я сделал это в методе drawRect (_:) класса UIView, написав следующий код:
override func drawRect(rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
CGContextBeginTransparencyLayer (context, nil)
let path = createCurvePath()
UIColor.blueColor().setStroke()
path.stroke()
CGContextSetBlendMode(context, .SourceIn)
let colors = [UIColor.blueColor().CGColor, UIColor.redColor().CGColor]
let colorSpace = CGColorSpaceCreateDeviceRGB()
let colorLocations :[CGFloat] = [0.0, 1.0]
let gradient = CGGradientCreateWithColors(colorSpace, colors, colorLocations)
let startPoint = CGPoint(x: 0.0, y: rect.size.height / 2)
let endPoint = CGPoint(x: rect.size.width, y: rect.size.height / 2)
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, CGGradientDrawingOptions.DrawsBeforeStartLocation)
CGContextEndTransparencyLayer(context)
}
Функция createCurvePath() возвращает объект UIBezierPath. Я также установил path.lineWidth в 5 пунктов.