2013-07-23 2 views
0

Я использую ниже код, чтобы нарисовать дугу в метод drawLayer заказного CALayer класса, но ничего не отображается:UIBezierPaths не показаны в CALayer drawLayer InContext

(void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 

{ 
    float r = self.bounds.size.width/2; 

    CGContextClearRect(ctx, self.bounds); // clear layer 
    CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor); 

    //CGContextFillRect(ctx, layer.bounds); 

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:r startAngle:-M_PI_2 endAngle:M_PI_2 clockwise:NO]; 

    CGContextAddPath(ctx, path.CGPath); 
    CGContextStrokePath(ctx); 
} 

Обратите внимание, что если я раскомментировать CGContextFillRect(ctx, layer.bounds) line, прямоугольник правильно отображается.

+1

Отсутствует цвет обводки? –

ответ

0

Проблема, которую я вижу в том, что вы не установите цвет обводки (но цвет заливки)

CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor); 

При настройке заполнить цвет он используется для заполнения тропинки. То же самое для цвета штриха.


Если вы хотите только хотите либо обводке или заливке пути, то вы должны использовать либоCGContextStrokePath или CGContextFillPath, но если вы хотите сделать и тогда вы должны использовать CGContextDrawPath с kCGPathFillStroke как «рисунок режима» ,

0

Спасибо вам обоим. В конце концов я решил нарисовать дугу вне метода drawLayer используя следующий код:

- (id) initWithLayer:(id)layer withRadius:(float)radius 
{ 
    self = [super initWithLayer:layer]; 

    // ... 

    self.strokeColor = [UIColor whiteColor].CGColor; 
    self.lineWidth = 10.0; 

    return self; 
} 

- (void) update:(float)progress 
{ 
    // .... 

    UIBezierPath *arcPath = [UIBezierPath bezierPath]; 
    [arcPath addArcWithCenter:CGPointMake(r, r) radius:r - self.lineWidth/2 startAngle:startAngle endAngle:nextAngle clockwise:YES]; 
    self.path = arcPath.CGPath; 
} 
0

Похоже, все дуги методы как CGPath и UIBezierPath рисунок имеют ошибку на 64-разрядных устройств, где они работают только тогда, когда по часовой стрелке для параметра установлено значение YES. Я замечаю, что ваш нерабочий код показывает clockwise:NO, а рабочий код имеет clockwise:YES.

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