2010-10-29 5 views
0

Dans l'une de mes applications, j'ai un dessin personnalisé semi-transparent UIView que j'utilise comme couverture sur un autre UIView pour un effet spécial.CGContextSetLineWidth de largeur variable autour du chemin

Basse Vue: alt text

Lower View avec vue personnalisée sur le dessus: alt text

Il fonctionne, son grand sur l'iPhone où les marges latérales ne sont que 10 pixels, mais maintenant je dois développer les marges gauche et droite pour correspondre à la ligne ci-dessous.

Voici mon code:

- (void)draw:(TTStyleContext*)context { 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 

    [_color setStroke]; 
    CGContextSetLineWidth(ctx, MIN(_xwidth, _ywidth)); 

    CGFloat fw = context.frame.size.width; 
    CGFloat fh = context.frame.size.height; 

    CGContextMoveToPoint(ctx, fw, floor(fh/2)); 
    CGContextAddArcToPoint(ctx, fw, fh, floor(fw/2), fh, RD(_radius)); 
    CGContextAddArcToPoint(ctx, 0, fh, 0, floor(fh/2), RD(_radius)); 
    CGContextAddArcToPoint(ctx, 0, 0, floor(fw/2), 0, RD(_radius)); 
    CGContextAddArcToPoint(ctx, fw, 0, fw, floor(fh/2), RD(_radius)); 
    CGContextClosePath(ctx); 
    CGContextStrokePath(ctx); 

    CGContextRestoreGState(ctx); 

    context.frame = CGRectInset(context.frame, _xwidth/2, _ywidth/2); 
    return [self.next draw:context]; 
} 

Après avoir réglé le _xwidth et _ywidth, la partie clé de ce code est le MIN pour la largeur de course. L'idée ici est que le cadre est par défaut, la même largeur de trait tout autour. Ce que je lui demande de faire est de faire la largeur de course plus grande sur les côtés que sur le haut et le bas. L'utilisation de MIN garantit que le trait n'obtient pas la taille plus épaisse _xwidth et saigne au centre. Si j'utilise la valeur _ywidth, les côtés sont superbes, mais je n'obtiens plus le rouge transparent car les bords supérieur et inférieur saignent au centre. Cela me amène à ma question:

est-il pour moi un moyen de préciser que je veux la course soit _xwidth épaisse sur les côtés et _ywidth d'épaisseur sur le haut et le bas? Sinon, y a-t-il un autre moyen plus facile que je néglige?

Avec mon code, _xwidth réglé sur 42, _ywidth réglé sur 10, je reçois ceci: alt text Vous pouvez voir ce que je vais faire ici, et comment je dois obtenir la course de côté pour couvrir le rouge à découvert Contexte.

Répondre

0

j'ai pu pirater en modifiant le chemin et en avec la ligne de thiner, puis en appliquant une autre course autour d'un rect élargi avec la ligne plus épaisse pour masquer le trop-plein

- (void)draw:(TTStyleContext*)context { 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 

    CGRect oldFrame = context.frame; 

    context.frame = CGRectInset(context.frame, (_xwidth > _ywidth ? _xwidth/2 : 0), (_ywidth > _xwidth ? _ywidth/2 : 0)); 
    CGFloat ox = (_xwidth > _ywidth ? _xwidth/2 - _ywidth/2 : 0); 
    CGFloat oy = (_ywidth > _xwidth ? _ywidth/2 - _xwidth/2 : 0); 
    CGFloat fw = context.frame.size.width + ox + (_xwidth > _ywidth ? _ywidth : 0); 
    CGFloat fh = context.frame.size.height + oy + (_ywidth > _xwidth ? _xwidth : 0); 

    CGContextMoveToPoint(ctx, fw, floor(fh/2)); 
    CGContextAddArcToPoint(ctx, fw, fh, floor(fw/2), fh, RD(_radius)); 
    CGContextAddArcToPoint(ctx, ox, fh, ox, floor(fh/2), RD(_radius)); 
    CGContextAddArcToPoint(ctx, ox, oy, floor(fw/2), oy, RD(_radius)); 
    CGContextAddArcToPoint(ctx, fw, oy, fw, floor(fh/2), RD(_radius)); 
    CGContextClosePath(ctx); 

    [_color setStroke]; 
    CGContextSetLineWidth(ctx, MIN(_xwidth, _ywidth)); 
    CGContextStrokePath(ctx); 

    if (_xwidth != _ywidth) { 
     CGContextSetLineWidth(ctx, MAX(_xwidth, _ywidth)); 
     CGContextStrokeRect(ctx, CGRectInset(oldFrame, (_ywidth > _xwidth ? -2*_xwidth : 0), (_xwidth > _ywidth ? -2*_ywidth : 0))); 
    } 

    CGContextRestoreGState(ctx); 

    context.frame = CGRectInset(oldFrame, _xwidth/2, _ywidth/2); 
    return [self.next draw:context]; 
} 

alt text

0

Il serait beaucoup plus simple de remplir simplement le même chemin que vous caressez.

Questions connexes