Liebe Stack-Überlauf-Community,
Ich habe ein Problem bezüglich der Maskeneigenschaft von CAShapeLayer
in iOS (Swift).
Was ich versuche, ist ein Radiergummi , der Teile einer Bildebene durch Maskierung löscht. Das Problem tritt auf, wenn ich versuche es zu invertieren.
Ich fand einige gute Antworten auf die Invertierung eines Pfades, aber diese waren nur nützlich, wenn Sie einen gefüllten Pfad verwenden. Was ich versuche, ist stroke ein Pfad und benutze den invertierten, um ein Bild zu maskieren. Die Linienbreite auf dem Strich sollte etwa 30.0
sein, so dass es wie ein Radiergummi aussieht.
Ich habe verschiedene Dinge ausprobiert. Meine aktuelle Version sieht so aus:
CAShapeLayer
, das den Pfad des Löschers enthält fill-color
der Ebene auf nil
stroke-color
und line width
fest
Das funktioniert gut, aber es macht nur die Teile des Bildes sichtbar, die sich innerhalb des Strokes befinden . Ich möchte es umgekehrt tun. Ich dachte an eine Schwarz-Weiß-Maske, aber das funktioniert nicht, weil die Maske durch den Alpha-Kanal geliefert wird.
Hat jemand eine Idee, wie man das Problem lösen kann?
Dies erreichen Sie, indem Sie mit transparenten Farben zu einer nicht deckenden Ebene zeichnen. Dies kann durch Verwendung eines anderen Mischmodus für das Zeichnen erfolgen. Leider unterstützt CAShapeLayer
dies nicht. Daher müssen Sie eine eigene Shape-Layer-Klasse schreiben:
Erstellen einer Ebene mit einem transparenten Pfad:
%Vor%Ich habe diesen Code verwendet, um einen halbtransparenten Kreis mit transparentem Rahmen vor einem grünen Hintergrund zu zeichnen:
Bearbeiten: Hier ist der entsprechende Code für die Ebene in Swift:
%Vor% Hinweis : Wenn Sie die Eigenschaften mit @NSManaged
markieren, können Sie die Eigenschaften animierbar machen, indem Sie needsDisplay(forKey inKey:)
in Swift bzw. needsDisplayForKey:
in Objective C implementieren. Ich habe den Swift-Code entsprechend angepasst.
Aber selbst wenn Sie keine Animationen benötigen, ist es besser, die Eigenschaften mit @NSManaged
zu markieren, da QuartzCore Kopien von Layern erstellt und alle Eigenschaften damit kopieren soll. @NSManaged
in Swift ist das Gegenstück zu @dynamic
in Objective C, da es die Erstellung einer Eigenschaftsimplementierung vermeidet. Stattdessen ruft CALayer
Eigenschaftenwerte mit value(forKey:)
bzw. setValue(_:forKey:)
ab und legt sie fest.