¿Cómo obtengo el último punto de CGContext en Objective-C?

Estoy trabajando en una barra de progreso personalizada y quiero get el último punto de CGContext porque quiero agregar una image al estado actual.

Este es mi código:

 -(void)drawRect:(CGRect)rect { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGPoint center = CGPointMake(rect.size.width/2, rect.size.height/2); float minSize = MIN(rect.size.width, rect.size.height); float lineWidth = _strokeWidth; if(lineWidth == -1.0) lineWidth = minSize*_strokeWidthRatio; float radius = (minSize-lineWidth)/2; float endAngle = M_PI*(self.value*2); //what should i do here //_pont.center = CGPointMake CGContextSaveGState(ctx); CGContextTranslateCTM(ctx, center.x, center.y); CGContextRotateCTM(ctx, -M_PI*0.5); CGContextSetLineWidth(ctx, lineWidth); CGContextSetLineCap(ctx, kCGLineCapRound); // "Full" Background Circle: CGContextBeginPath(ctx); CGContextAddArc(ctx, 0, 0, radius, 0, 2*M_PI, 0); CGContextSetStrokeColorWithColor(ctx, [_color colorWithAlphaComponent:0.1].CGColor); CGContextStrokePath(ctx); // Progress Arc: CGContextBeginPath(ctx); CGContextAddArc(ctx, 0, 0, radius, 0, endAngle, 0); CGContextSetStrokeColorWithColor(ctx, [_color colorWithAlphaComponent:0.9].CGColor); CGContextStrokePath(ctx); CGContextRestoreGState(ctx); } 

Tiene que usar CGContextGetPathCurrentPoint, pero debe llamar antes de borrar la ruta llamando a stroke o fill. Entonces, mire el siguiente patio de recreo y vea qué varía el valor devuelto por la devolución CGContextGetPathCurrentPoint cuando lo llama.

 import CoreGraphics import UIKit let lineWidth = CGFloat(10) let rect = CGRectMake(0, 0, 100, 100) let size = CGSizeMake(100, 100) UIGraphicsBeginImageContextWithOptions(size, false, 0.0) let ctx = UIGraphicsGetCurrentContext() let center = CGPointMake(rect.size.width/2, rect.size.height/2); let minSize = fmin(rect.size.width, rect.size.height); let radius = (minSize-10)/2; let endAngle = CGFloat(M_PI*(20.0*2)) CGContextSaveGState(ctx); CGContextTranslateCTM(ctx, center.x, center.y); CGContextRotateCTM(ctx, CGFloat(-M_PI*0.5)); CGContextSetLineWidth(ctx, lineWidth); CGContextSetLineCap(ctx, CGLineCap.Round); // "Full" Background Circle: CGContextBeginPath(ctx); CGContextAddArc(ctx, 0, 0, radius, 0, CGFloat(2*M_PI), 0); CGContextSetStrokeColorWithColor(ctx, UIColor.greenColor().CGColor); var endPoint = CGContextGetPathCurrentPoint(ctx) CGContextStrokePath(ctx); endPoint = CGContextGetPathCurrentPoint(ctx) // Progress Arc: CGContextBeginPath(ctx); CGContextAddArc(ctx, 0, 0, radius, 0, endAngle, 0); endPoint = CGContextGetPathCurrentPoint(ctx) CGContextSetStrokeColorWithColor(ctx, UIColor.networkingColor().CGColor); CGContextStrokePath(ctx); CGContextRestoreGState(ctx); let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() 

Todo es geometry simple.

Con la matriz de transformación de context de su drawRect: código, debe usar:

 CGPoint lastPoint = CGPointMake(radius * cos(endAngle), radius * sin(endAngle)); 

Después de restablecer o antes de la configuration CTM, debe usar:

 //Replace "what should i do here" comment with following code: CGPoint lastPoint = CGPointZero; lastPoint.x = center.x + radius * cos(endAngle - M_PI * 0.5); lastPoint.y = center.y + radius * sin(endAngle - M_PI * 0.5); 

Además, la segunda solución funcionará fuera de drawRect: implementación.