Наш дизайнер попросил меня воссоздать это: Использование Core Graphics от ObjectiveC, как вам нарисовать стрелку вокруг круга?
Im подклассов UIView, и я переопределить команду DrawRect так:
[super drawRect:frame];
CGFloat x = self.frame.origin.x;
CGFloat y = self.frame.origin.y;
CGFloat w = self.frame.size.width;
CGFloat h = self.frame.size.height;
CGFloat lineWidth = lineWidthRequested;
CGPoint centerPoint = CGPointMake(w/2, h/2);
CGFloat radius = radiusRequested;
CGFloat startAngle = 3 * M_PI/2;
CGFloat endAngle = startAngle + percentage * 2 * M_PI;
CGMutablePathRef arc = CGPathCreateMutable();
CGPathAddArc(arc, NULL,
centerPoint.x, centerPoint.y,
radius,
startAngle,
endAngle,
NO);
CGPathRef strokedArc = CGPathCreateCopyByStrokingPath(arc, NULL,
lineWidth,
kCGLineCapButt,
kCGLineJoinMiter, // the default
10); // 10 is default miter limit
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextAddPath(c, strokedArc);
CGContextSetFillColorWithColor(c, [UIColor colorWithRed:239/255.0 green:101/255.0 blue:47/255.0 alpha:1.0].CGColor);
CGContextDrawPath(c, kCGPathFill);
То, что я закончил с это:
Должен по-прежнему рисовать стрелку. Будет легко, не так ли?
После борьбы вспомнить мои триг, я нашел вращение точек вокруг центра на этой странице: Rotating a point around an origin in VB
Но когда я попытался перевод объективных C нарисовать стрелку, я получаю очень странные результаты. Вот код, далее вниз в DrawRect:
CGFloat triangle[3][2] = {{centerPoint.x + 10, h - (centerPoint.y + radius)},
{centerPoint.x, h - (centerPoint.y + radius + lineWidth/2)},
{centerPoint.x, h - (centerPoint.y + radius - lineWidth/2)}};
for (int idx=0;idx < 3; idx++) {
// translate to origin
triangle[idx][0] -= centerPoint.x;
triangle[idx][1] -= centerPoint.y;
}
CGFloat angDistance = endAngle - startAngle;
CGFloat ct = cos(angDistance);
CGFloat st = sin(angDistance);
for (int idx=0;idx < 3; idx++) {
// rotate
triangle[idx][0] = ct * triangle[idx][0] - st * triangle[idx][1];
triangle[idx][1] = -st * triangle[idx][0] + ct * triangle[idx][1];
}
for (int idx=0;idx < 3; idx++) {
// translate back to position
triangle[idx][0] += centerPoint.x;
triangle[idx][1] += centerPoint.y;
}
NSLog(@"Rotating through %g, %06.1f,%06.1f , ct - %g, st - %g",angDistance, triangle[0][0],triangle[0][1],ct, st);
// XXX todo draw the filled triangle at end.
// draw a red triangle, the point of the arrow
CGContextSetFillColorWithColor(c, [[UIColor greenColor] CGColor]);
CGContextMoveToPoint(c, triangle[0][0], triangle[0][1]);
CGContextAddLineToPoint(c, triangle[1][0], triangle[1][1]);
CGContextAddLineToPoint(c, triangle[2][0], triangle[2][1]);
CGContextFillPath(c);
Я ожидал, что я делаю эти точки, а затем перевести их происхождения, вращать, а затем перевести их обратно, я бы смеялся.
Однако, это не то, что происходит ... при увеличении процента от 0 до 2pi стрелка направляется в неопределенно треугольный маршрут. Когда angDistance равно нулю или pi, стрелка находится в нужном месте. Когда я направляюсь в направлении pi/2 или 3pi/2, стрелка направляется к нижним углам замкнутого прямоугольника.
Должно быть, я делаю что-то вопиющее глупо, но я не могу, чтобы жизнь меня видела.
Любые идеи?
Спасибо,
Кен
[Это Q & A] (http://stackoverflow.com/q/13562137/77567) может представлять интерес для Вас. –