2013-07-23 5 views
0

J'utilise le code ci-dessous pour dessiner un arc dans la drawLayer méthode d'une coutume CALayer classe, mais rien ne s'afficheUIBezierPaths Non Affichage en 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); 
} 

Notez que si je décommenter le CGContextFillRect(ctx, layer.bounds) ligne, un rectangle est correctement rendu.

+1

Vous ne disposez pas d'une couleur de contour? –

Répondre

0

Le problème que je vois est que vous ne définissez pas une couleur de course (mais une couleur de remplissage)

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

Lorsque vous configurez un de remplissage couleur est utilisé pour remplir le chemin. Idem pour une couleur de trait.


Si vous voulez que voulez soit un AVC ou remplir le chemin, vous devez utiliser soitCGContextStrokePath ou CGContextFillPath mais si vous voulez faire les deux, alors vous devriez utiliser CGContextDrawPath avec kCGPathFillStroke comme le mode « dessin » .

0

Merci à vous deux. J'ai finalement décidé de dessiner l'arc en dehors de la méthode drawLayer en utilisant le code suivant:

- (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

Il ressemble à toutes les méthodes de dessin à l'arc pour les deux CGPath et UIBezierPath ont un bug sur les 64 appareils de bits où ils ne fonctionnent que si dans le sens horaire Le paramètre est défini sur YES. Je remarque que votre code non-travail montre clockwise:NO et le code de travail a clockwise:YES.

Questions connexes