2015-03-14 2 views
0

У меня есть UIBezierPath, который является дугой. Я хочу только обратить штрих в графический контекст (то есть, ход дуги, не включая линию, соединяющую конечные и начальные точки дуги)CoreGraphics - Нарисовать ход дуги

Как только я это сделаю, я могу добавить линейный градиент к контексту, эффективно рисующий градиент на такте дуги.

Вот мой DrawRect:

let context = UIGraphicsGetCurrentContext() 

    CGContextSaveGState(context) 
    CGContextAddPath(context, _progressPathForProgress(_progressToDrawForProgress(progress)).CGPath) 
    CGContextStrokePath(context) 
    CGContextClip(context) 

    let colours = [self.startColour.CGColor, self.endColour.CGColor] 
    let colourSpace = CGColorSpaceCreateDeviceRGB() 
    let colourLocations: [CGFloat] = [0.0, 1.0] 

    let gradient = CGGradientCreateWithColors(colourSpace, colours, colourLocations) 

    var startPoint = CGPoint.zeroPoint 
    var endPoint = CGPoint(x: 0, y: bounds.height) 
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, CGGradientDrawingOptions.allZeros) 

    CGContextRestoreGState(context) 

Но все это делает добавить градиент к полноте моего UIView. Где я ошибся?

ответ

0

Путь должен быть закрыт, чтобы заставить обрезку работать.

Если вы не хотите видеть закрывающую линию, вы можете установить цвет хода на UIColor.clearColor(), а затем закрыть путь.

CGContextSaveGState(context) 
CGContextAddPath(context, _progressPathForProgress(_progressToDrawForProgress(progress)).CGPath) 
CGContextStrokePath(context) 

CGContextSetStrokeColorWithColor(context, UIColor.clearColor().CGColor) 

// close the path, you will need to add some more points here, otherwise 
// the end point is simply connected to the start point 
CGPathCloseSubpath(...) 

CGContextClip(context) 

// draw the gradient 

я объясню, что я имею в виду добавляющих больше очков, чтобы закрыть путь. Следующие изображения являются снимками экрана из одного из моих приложений, это профиль высоты с градиентом ниже графика.

enter image description here

Закрытие путь непосредственно приведет к этому, то есть градиент не будет обращено вниз к оси х:

enter image description here

, чтобы закрыть путь правильно добавить точки из (x, 0), затем до (0,0) и, наконец, закрыть путь с первой точкой:

enter image description here

Я не хочу видеть закрывающие линии, поэтому я использую UIColor.clearColor() здесь.

Надеюсь, у вас есть идея.

+0

Спасибо за ответ, можете ли вы подробнее рассказать о своих комментариях? Какие пункты мне нужно добавить? –

+0

Я обновил свой ответ, чтобы объяснить это. – zisoft

+0

Спасибо за обновление –

Смежные вопросы