Invert CALayer-Maske, die auf einem Strich basiert (keine Füllung)

9

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:

  1. Erstellen Sie ein CAShapeLayer , das den Pfad des Löschers enthält
  2. Setze fill-color der Ebene auf nil
  3. Legen Sie stroke-color und line width fest
  4. Fügen Sie die Ebene als Maske der Image-Ebene
  5. hinzu

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?

    
Lars Petersen 02.08.2016, 19:37
quelle

1 Antwort

3

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:

%Vor%

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.

    
clemens 14.12.2016, 07:58
quelle

Tags und Links