2009-04-14 4 views
3

Je tente d'implémenter une vue personnalisée. Cette vue doit afficher une image entourée d'une bordure rectiligne grise et arrondie. Je peux obtenir l'image pour bien afficher, ainsi que la bordure, cependant, comme la bordure a des coins arrondis, j'ai besoin d'un moyen d'effacer ces coins de sorte qu'ils affichent correctement ce qui se trouve derrière la vue. Comment puis-je accomplir cela?Comment puis-je effacer les coins à l'extérieur d'un rectangle arrondi à l'aide du SDK iPhone?

Il semble que je pourrais être en mesure d'utiliser CGContextClearRect, mais alors ne devrais-je pas appeler cela plusieurs fois, reconstruire la zone en dehors de mon coin arrondi? Cela semble trop compliqué.

Y a-t-il une meilleure façon de créer cette vue?

Voici mon code actuel:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Draw the image. This will completely fill the current rect. 
    [image drawInRect:self.bounds]; 

    // Ensure we draw completely within our bounds instead of straddling it. 
    CGRect rrect = self.bounds; 
    rrect.size.height = rrect.size.height - 1.0; 
    rrect.size.width = rrect.size.width - 1.0; 
    rrect.origin.x = rrect.origin.x + (1.0/2); 
    rrect.origin.y = rrect.origin.y + (1.0/2); 

    CGFloat radius = 5.0; 
    CGFloat minx = CGRectGetMinX(rrect); 
    CGFloat midx = CGRectGetMidX(rrect); 
    CGFloat maxx = CGRectGetMaxX(rrect); 
    CGFloat miny = CGRectGetMinY(rrect); 
    CGFloat midy = CGRectGetMidY(rrect); 
    CGFloat maxy = CGRectGetMaxY(rrect); 

    // Draw the rounded rect border. 
    CGContextSetRGBStrokeColor(context, 0.6, 0.6, 0.6, 1.0); 
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0); 
    CGContextSetLineWidth(context, 1.0); 
    CGContextMoveToPoint(context, minx, midy); 
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 
    CGContextClosePath(context); 
    CGContextDrawPath(context, kCGPathFillStroke); 
} 

Répondre

7

Ajouter le chemin rect arrondi au chemin de détourage avant de dessiner l'image.

+0

Merci! Ainsi, CGContextClip semble effacer le chemin de dessin actuel. Cela signifie-t-il que j'ai besoin de suivre deux fois le même chemin? Une fois pour couper, puis une fois pour dessiner? Aussi, je dois sauvegarder l'état du contexte avant écrêtage et le restaurer après avoir dessiné l'image, correct? Sinon, mon chemin chevauche le clip. –

+0

Vous avez seulement besoin du chemin dans le chemin courant si vous voulez le remplir ou le caresser. Dessiner une image n'a rien à voir avec le chemin courant; seul le chemin de détourage l'affecte. Et oui, si vous voulez dessiner après coup, vous devez gsave avant et grestore après. –

+0

Mais vous avez également besoin du chemin dans le chemin courant si vous voulez le découper (lors de l'appel de CGContextClip). Donc je dois ajouter le chemin au contexte deux fois, non? Une fois juste avant CGContextClip et une fois avant de caresser. Je m'assure juste de ne pas manquer d'astuces. –