Подтвердить что ты не робот

На OSX, как мне градиент заполнить ход пути?

Используя множество функций рисования в Cocoa или Кварце, довольно легко рисовать контуры и заполнять их, используя градиент. Я не могу найти приемлемый способ, однако, чтобы "обвести" -draw путь с шириной линии в несколько пикселей и заполнить этот штрих, используя градиент. Как это сделать?

Изменение: видимо вопрос не был достаточно ясным. Спасибо за ответы, но я уже понял это. Что я хочу сделать, это:

squares
(источник: emle.nl)

Левый квадрат - это NSGradient, нарисованный в пути, за которым следует сообщение об обводке пути. Право - это то, что я хочу сделать; Я хочу заполнить обводку с помощью градиента.

4b9b3361

Ответ 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 пунктов.