2009-04-14 11 views
3

Ich versuche eine benutzerdefinierte Ansicht zu implementieren. In dieser Ansicht sollte ein Bild angezeigt werden, das von einem grauen, abgerundeten, rechteckigen Rahmen umgeben ist. Ich kann das Bild gut darstellen, aber auch die Umrandung. Da die Umrandung jedoch abgerundete Ecken hat, muss ich diese Ecken so entfernen, dass sie korrekt anzeigen, was sich hinter der Ansicht befindet. Wie kann ich das erreichen?Wie kann ich die Ecken außerhalb einer abgerundeten Ecke mit dem iPhone SDK löschen?

Es scheint so, als könnte ich CGContextClearRect verwenden, aber müsste ich das dann nicht mehrmals aufrufen und den Bereich außerhalb meiner abgerundeten Ecke rekonstruieren? Das klingt übermäßig kompliziert.

Gibt es eine bessere Möglichkeit, diese Ansicht zu erstellen?

Hier ist mein aktueller Code:

- (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); 
} 

Antwort

7

Fügen Sie den abgerundeten rect Pfad zu dem Beschneidungspfad, bevor das Bild zeichnen.

+0

Dank! Daher scheint CGContextClip den aktuellen Zeichenpfad zu löschen. Bedeutet das, dass ich den gleichen Weg zweimal verfolgen muss? Einmal zum Ausschneiden und dann einmal zum Zeichnen? Außerdem muss ich den Zustand des Kontextes vor dem Clipping speichern und nach dem Zeichnen des Bildes wiederherstellen, richtig? Sonst überspannt mein Weg den Clip. –

+0

Sie benötigen nur den Pfad im aktuellen Pfad, wenn Sie ihn füllen oder streichen möchten. Das Zeichnen eines Bildes hat nichts mit dem aktuellen Pfad zu tun; nur der Beschneidungspfad wirkt sich darauf aus. Und ja, wenn du danach unclipped zeichnen willst, musst du vorher grest und danach grestore. –

+0

Sie benötigen aber auch den Pfad im aktuellen Pfad, wenn Sie einen Clip erstellen (wenn Sie CGContextClip aufrufen). Also muss ich den Pfad zweimal zum Kontext hinzufügen, oder? Einmal direkt vor CGContextClip und schon einmal streicheln. Ich stelle nur sicher, dass mir keine Tricks fehlen. –

Verwandte Themen