2010-12-03 9 views
1

Ich erstelle eine iPad App für 3.2 und höher. Meine App hat eine Überlagerungsansicht mit einer halbtransparenten Darstellung, die alles darunter dunkler macht. In der Mitte dieser Ansicht bin Hacken ich ein Loch in diesem Halbdurchsichtigkeit Teil des Hintergrundfilters durch unversehrt, mit diesem Code zu lassen:Wie kann ich eine UIView mit abgerundeten Ecken aus der übergeordneten Ansicht entfernen?

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect intersection = CGRectIntersection(hole.frame, rect); 
    CGContextClearRect(context, intersection); 
} 

Zusätzlich kann das ‚Loch‘ Ansicht abgerundete Ecken hat, aufgebracht über :

self.layer.cornerRadius = 4.25; 

Dieses große Ausnahme ein kleines Problem arbeitet - diese abgerundeten Ecken nicht berücksichtigt werden, so dass das Loch, das anstelle von quadratischen Ecken aus abgerundeten gehackt wird. Ich muss das reparieren, aber ich habe keine Ahnung wie. Irgendwelche Ideen, Beispiele, Gedanken?

Antwort

3

Hier ist, wie ich es immer am Ende zu arbeiten. Dies erzeugt ein Loch mit dem gleichen Rahmen wie das "Loch" UIView und schneidet es aus sich heraus (UIView). So können Sie ungehindert sehen, was sich hinter dem "Loch" befindet.

- (void)drawRect:(CGRect)rect { 
    CGFloat radius = self.hole.layer.cornerRadius; 
    CGRect c = self.hole.frame; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

     // this simply draws a path the same shape as the 'hole' view 
    CGContextMoveToPoint(context, c.origin.x, c.origin.y + radius); 
    CGContextAddLineToPoint(context, c.origin.x, c.origin.y + c.size.height - radius); 
    CGContextAddArc(context, c.origin.x + radius, c.origin.y + c.size.height - radius, radius, M_PI_4, M_PI_2, 1); 
    CGContextAddLineToPoint(context, c.origin.x + c.size.width - radius, c.origin.y + c.size.height); 
    CGContextAddArc(context, c.origin.x + c.size.width - radius, c.origin.y + c.size.height - radius, radius, M_PI_2, 0.0f, 1); 
    CGContextAddLineToPoint(context, c.origin.x + c.size.width, c.origin.y + radius); 
    CGContextAddArc(context, c.origin.x + c.size.width - radius, c.origin.y + radius, radius, 0.0f, -M_PI_2, 1); 
    CGContextAddLineToPoint(context, c.origin.x + radius, c.origin.y); 
    CGContextAddArc(context, c.origin.x + radius, c.origin.y + radius, radius, -M_PI_2, M_PI, 1); 

     // finish 
    CGContextClosePath(context); 
    CGContextClip(context); // this is the secret sauce 
    CGContextClearRect(context, c); 
} 
0

Wenn Sie die cornerRadius-Eigenschaft eines Layers ändern, müssen Sie in der zugehörigen Ansicht auch clipsToBounds auf YES setzen, damit der Inhalt an den abgerundeten Ecken abgeschnitten wird.

+0

clipsToBounds ist, ob Sie Objekte außerhalb der Grenzen der Empfängeransicht zeichnen können oder nicht. Mit anderen Worten, können Sie die Unteransichten einer UIView außerhalb der Grenzen der übergeordneten UIView zeichnen. Nicht sicher, wie das hier helfen wird. – Allyn

+0

Der 'cornerRadius' wird in den Clipping-Pfad aufgenommen (grob gesagt), also müssen Sie Clipping aktiviert haben, damit es auf Ihren Inhalt wirkt. –

+0

Ich habe es gerade versucht und es scheint nicht die Ecken zu reparieren..ist da noch etwas anderes zu tun, damit es funktioniert? – Allyn

1

Was Sie versuchen zu tun, heißt Maskierung. Sie können Core Graphics verwenden, um den aktuellen Grafikkontext zu maskieren. Siehe Apples Dokumentation zu diesem Thema hier:

http://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-CJBHDDBE

+0

Das sieht in Bezug auf Bilder - ich muss eine Sicht maskieren. Ist es angemessen, eine Ansicht in ein Bild zu rendern, nur um Operationen auszuführen? – Allyn

+0

Definitiv. Sie können den Code, den ich hier gepostet habe, ändern: http://stackoverflow.com/questions/4168484/exporting-customized-guidableviewcells-into-uiimage/4169320#4169320 – Ryan

Verwandte Themen