Ich habe eine einfache Ansicht (linke Seite des Bildes) und ich muss eine Art Überlagerung (rechte Seite des Bildes) zu dieser Ansicht erstellen. Diese Überlagerung sollte eine gewisse Deckkraft haben, damit die Ansicht darunter teilweise noch sichtbar ist. Am wichtigsten ist, dass diese Überlagerung in der Mitte ein kreisförmiges Loch aufweist, damit sie nicht die Mitte der Ansicht überlagert (siehe Bild unten).
Ich kann leicht einen Kreis wie diesen erstellen:
int radius = 20; //whatever
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0,radius,radius) cornerRadius:radius].CGPath;
circle.position = CGPointMake(CGRectGetMidX(view.frame)-radius,
CGRectGetMidY(view.frame)-radius);
circle.fillColor = [UIColor clearColor].CGColor;
Und eine "volle" rechteckige Überlagerung wie diese:
CAShapeLayer *shadow = [CAShapeLayer layer];
shadow.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height) cornerRadius:0].CGPath;
shadow.position = CGPointMake(0, 0);
shadow.fillColor = [UIColor grayColor].CGColor;
shadow.lineWidth = 0;
shadow.opacity = 0.5;
[view.layer addSublayer:shadow];
Aber ich habe keine Ahnung, wie ich diese beiden Ebenen kombinieren kann, damit sie den gewünschten Effekt erzielen. Jemand? Ich habe wirklich alles versucht ... Vielen Dank für die Hilfe!
ios
objective-c
calayer
quartz-core
animal_chin
quelle
quelle
moveToPoint
fügen Sie dann das abgerundete Rect hinzu. Überprüfen Sie die Dokumente auf die von angebotenen MethodenUIBezierPath
.Antworten:
Ich konnte dies mit dem Vorschlag von Jon Steinmetz lösen. Wenn es jemanden interessiert, ist hier die endgültige Lösung:
Swift 3.x:
Swift 4.2 & 5:
quelle
Um diesen Effekt zu erzielen, war es am einfachsten, eine gesamte Ansicht über dem Bildschirm zu erstellen und dann Teile des Bildschirms mithilfe von Ebenen und UIBezierPaths zu subtrahieren. Für eine schnelle Implementierung:
Ich habe den obigen Code getestet und hier ist das Ergebnis:
Ich habe CocoaPods eine Bibliothek hinzugefügt, die einen Großteil des obigen Codes abstrahiert und es Ihnen ermöglicht, auf einfache Weise Überlagerungen mit rechteckigen / kreisförmigen Löchern zu erstellen, sodass der Benutzer mit Ansichten hinter der Überlagerung interagieren kann. Ich habe es verwendet, um dieses Tutorial für eine unserer Apps zu erstellen:
Die Bibliothek heißt TAOverlayView und ist unter Apache 2.0 Open Source. Ich hoffe du findest es nützlich!
quelle
Akzeptierte Lösung Swift 3.0 kompatibel
quelle
Ich habe einen ähnlichen Ansatz wie animal_chin gewählt, bin aber visueller, daher habe ich das meiste davon in Interface Builder mithilfe von Outlets und automatischem Layout eingerichtet.
Hier ist meine Lösung in Swift
quelle
Code Swift 2.0 kompatibel
Ausgehend von der Antwort @animal_inch codiere ich eine kleine Utility-Klasse und hoffe, dass sie Folgendes zu schätzen weiß:
Dann, wo immer in Ihrem Code:
quelle