Objective C iOS在弧上绘制矩形

时间:2013-11-19 10:33:25

标签: ios objective-c core-graphics cgcontext

我需要在iOS应用程序中绘制自定义弧。图片展示了我想如何使用小矩形绘制圆弧。我曾尝试使用绘制线条的CGContextAddArc,但我无法理解如何使用对象(矩形)而不仅仅是直线。这是可能的还是我应该选择另一种方法?

这是我要绘制的弧线:

2 个答案:

答案 0 :(得分:3)

不要尝试单独绘制每个元素,而是尝试绘制具有大宽度和虚线图案的单个弧。例如,行宽10.0和虚线1,10将绘制与您要实现的效果非常相似的效果 - 在指定的路径上放置10个点的一系列1x10矩形。

相关的CGContext函数是CGContextSetLineWidthCGContextSetLineDash

答案 1 :(得分:1)

我使用QuartzCore框架中的UIBenizerCurve绘制这种东西。我做了以下的演示代码,

<。p>类.h文件

struct angleRanges{
    float startRange;
    float endRange;
}angle_Range;

提供您的角度范围。 在.m文件中

#import <tgmath.h>
#import <QuartzCore/QuartzCore.h>
#define RADIUS 125.0f
#define METER_END_LIMIT 100.f
#define CIRCLE_STROKE_PATH_WIDTH 30.f
#define ANGAL -90.f

NSInteger numberOfParts = METER_END_LIMIT/5;
    float angleRange = 0;

for(int loopIndex = 0; loopIndex <= numberOfParts; loopIndex++){
    angle_Range.startRange = 0;
    angle_Range.endRange   = 360 - (180.f * angleRange)/METER_END_LIMIT;
    double actualLineAngle = angle_Range.endRange - angle_Range.startRange;

    float startAngle = actualLineAngle - 0.5;
    float endAngle = actualLineAngle + 0.5;

    startAngle =  DEGREES_TO_RADIANS(startAngle);
    endAngle = DEGREES_TO_RADIANS(endAngle);
    UIBezierPath *aPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x, self.center.y + RADIUS/2)
                                                         radius:(RADIUS+CIRCLE_STROKE_PATH_WIDTH/3)
                                                     startAngle:startAngle
                                                       endAngle:endAngle
                                                      clockwise:YES];

    CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
    [shapeLayer setFrame: self.frame];
    [shapeLayer setPath: [aPath CGPath]];
    shapeLayer.lineWidth = 5;
    [shapeLayer setStrokeColor:[[UIColor grayColor] CGColor]];
    [shapeLayer setFillColor:[[UIColor clearColor] CGColor]];
    [shapeLayer setMasksToBounds:YES];
    [self.layer addSublayer:shapeLayer];
    [aPath closePath];

    angleRange = angleRange + 5.0f;
}