Schlaganfall maskierte CALayer in iOS
Ich versuche, erstellen Sie ein label (oder jede andere Ansicht, für diese Angelegenheit) mit einer abgerundeten Ecke und ein Hub/Grenze. Ich kann erreichen die ehemaligen mit dem folgenden code:
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.label.bounds
byRoundingCorners:UIRectCornerBottomRight
cornerRadii:CGSizeMake(16.0f, 16.0f)];
CAShapeLayer *shape = [CAShapeLayer layer];
shape.frame = self.label.bounds;
shape.path = maskPath.CGPath;
self.label.layer.mask = shape;
Die großen Werke für die abgerundete Ecke, aber mit dem folgenden code wird nicht für den Schlaganfall, wie ich will. Stattdessen produzieren Sie einen schwarzen (oder wie auch immer die backgroundColor
von self.label
eingestellt ist) Platz Grenze.
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.label.bounds
byRoundingCorners:UIRectCornerBottomRight
cornerRadii:CGSizeMake(16.0f, 16.0f)];
CAShapeLayer *shape = [CAShapeLayer layer];
shape.frame = self.label.bounds;
shape.path = maskPath.CGPath;
//Add stroke
shape.borderWidth = 1.0f;
shape.borderColor = [UIColor whiteColor].CGColor;
self.label.backgroundColor = [UIColor blackColor];
self.label.layer.mask = shape;
Irgendwelche Vorschläge, wie ich mich bewerben kann eine beliebige farbige Kontur folgt, dass die maskierten Pfad?
InformationsquelleAutor der Frage Steve Wilford | 2013-08-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist auf der richtigen Spur mit der Form-Ebene. Man sollte doch zwei verschiedene Ebenen. Zuerst wird die Ebenenmaske wie in deinem ersten Beispiel, die Masken Ihre Ansicht (cuts off Bereiche, die Sie nicht wollen, sichtbar zu sein)
Anschließend fügen Sie die Schicht Form, auch, aber nicht als Ebenenmaske. Auch, stellen Sie sicher, dass Sie nicht verwenden, borderWidth und borderColor -, aber Schlaganfall.
Sich bewusst sein, dass Sie Ihr Schlaganfall-Schicht Pfad sollte drin sein (kleiner als) das den Weg von der Maske. Ansonsten, die gestreichelt Pfad maskiert, entfernt die Ebenenmaske. Ich habe den lineWith 3 das macht es so können Sie sehen, die Hälfte der Breite (1,5 px), und die andere Hälfte wird außerhalb der Maske.
InformationsquelleAutor der Antwort Accatyyc
Wenn Sie eine Unterklasse
CALayer
könnten Sie instanziieren es mit der Maske, die Sie möchten, und überschreiben auchlayoutSubLayers
zu gehören, die Grenze, die Sie auf die Maske.Könnte dies tun, ein paar Möglichkeiten. Unten Krank zu tun es, indem Sie die
path
von der vorgegebenen Maske, und zuordnen, um die class-Eigenschaft verwendet werden für den Bau der neuen GrenzelayoutSubLayers
. Es gibt Potenzial, dass diese Methode mehrfach aufgerufen werden, also habe ich auch einen boolean zu verfolgen. (Könnte auch weisen Sie die Grenze als Eigenschaft einer Klasse, und entfernen/neu hinzufügen, jedes mal. Für jetzt, ich benutze bool check.Swift 3:
InformationsquelleAutor der Antwort rambossa