圆形与边界垂直虚线

时间:2017-09-20 03:19:36

标签: ios objective-c

我正试图在圆圈的边框画一条带有垂直虚线的圆圈。

我试过这样的事情,但它在圈子里做点。

CAShapeLayer *circle = [CAShapeLayer layer];

circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 2.0*radius, 2.0*radius) cornerRadius:radius].CGPath;

circle.fillColor = [UIColor clearColor].CGColor;
circle.strokeColor = [UIColor redColor].CGColor;
circle.lineWidth = 1;

circle.lineDashPattern = @[@2, @3];
[[self.view layer] addSublayer:circle];

1 个答案:

答案 0 :(得分:2)

请尝试使用以下代码,它对我有用。 1)取UIView子类,并在.h文件中实现代码

#import <UIKit/UIKit.h>
@interface ViewClass : UIView

@property (nonatomic) NSUInteger numberOfGraduations; 
@property (nonatomic) CGFloat arcDegreeStart;
@property (nonatomic) CGFloat arcDegreeEnd;

@property (nonatomic) CGPoint arcCenter;
@property (nonatomic) CGFloat arcRadius;

@property (nonatomic) CGFloat deltaArc;  

-(void)drawGraduation:(CGPoint )center Radius:(CGFloat)radius Angle:(CGFloat)angle Length:(CGFloat)length Width:(CGFloat)width colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue;

@end

2)现在在your.m文件中,实现下面的代码

#import "ViewClass.h"

@implementation ViewClass
{
    CGContextRef c;
}
-(void)drawGraduation:(CGPoint )center Radius:(CGFloat)radius Angle:(CGFloat)angle Length:(CGFloat)length Width:(CGFloat)width colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue{
    c = UIGraphicsGetCurrentContext();

    CGFloat radius2 = radius+length; // The radius of the end points of the graduations
    CGPoint p1 = (CGPoint){cos(angle)*radius+center.x, sin(angle)*radius+center.y}; // the start point of the graduation
    CGPoint p2 = (CGPoint){cos(angle)*radius2+center.x, sin(angle)*radius2+center.y}; // the end point of the graduation

    CGContextMoveToPoint(c, p1.x, p1.y);
    CGContextAddLineToPoint(c, p2.x, p2.y);
    CGContextSetLineCap(c, kCGLineCapRound);
    CGContextSetRGBStrokeColor(c, red, green, blue, 1.0);
    CGContextSetLineWidth(c, width);
    CGContextSetBlendMode(c,kCGBlendModeNormal);
    CGContextStrokePath(c);

}

3)下面是drawRect方法..

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    CGRect r = self.bounds;

    _numberOfGraduations = 31;
    _arcCenter = (CGPoint){r.size.width*0.5, r.size.height*0.5}; // center of arc
    _arcRadius = (r.size.width*0.5)-20; // radius of arc

    CGFloat maxGraduationWidth = 1.0;

    CGFloat maxGraduationWidthAngle = maxGraduationWidth/_arcRadius; // the maximum graduation width angle (used to prevent the graduations from being stroked outside of the main arc)

    _arcDegreeStart =-M_PI*0.2; 

    _arcDegreeEnd = -M_PI*0.8; 

    // draw graduations
    _deltaArc = (_arcDegreeEnd-_arcDegreeStart+maxGraduationWidthAngle)/(_numberOfGraduations-1); // the change in angle of the arc
    for (int i = 0; i < _numberOfGraduations; i++) {

    [self drawGraduation:_arcCenter Radius:_arcRadius Angle:_arcDegreeStart+(i*_deltaArc) Length:14 Width:1 colorWithRed:0.0 green:0.0 blue:1.0];
        }

}