Mit dem folgenden Snippet füge ich einem meiner UIView einen Schlagschatteneffekt hinzu. Welches funktioniert ziemlich gut. Aber sobald ich die masksToBounds- Eigenschaft der Ansicht auf YES gesetzt habe . Der Schlagschatteneffekt wird nicht mehr gerendert.
self.myView.layer.shadowColor = [[UIColor blackColor] CGColor];
self.myView.layer.shadowOpacity = 1.0;
self.myView.layer.shadowRadius = 10.0;
self.myView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.myView.layer.cornerRadius = 5.0;
self.myView.layer.masksToBounds = YES; // <-- This is causing the Drop shadow to not be rendered
UIBezierPath *path = [UIBezierPath bezierPathWithCurvedShadowForRect:self.myView.bounds];
self.myView.layer.shadowPath = path.CGPath;
self.myView.layer.shouldRasterize = YES;
Hast du irgendwelche Ideen dazu?
ios
objective-c
uiview
calayer
jchatard
quelle
quelle
Es ist jetzt iOS 6, möglicherweise haben sich die Dinge geändert. Die Antwort von TheSquad funktioniert bei mir erst, wenn ich eine weitere Zeile hinzugefügt habe
view2.layer.masksToBounds = NO;
, da sonst kein Schatten angezeigt wird . Obwohl in der DokumentationmasksToBounds
standardmäßig NEIN angegeben ist, zeigt mein Code das Gegenteil.So erstelle ich eine Schaltfläche mit abgerundeten Ecken und Schatten, die zu den am häufigsten verwendeten Codeausschnitten in meiner App gehört.
BEARBEITEN
Wenn Ansichten animiert oder gescrollt werden müssen, ist die
masksToBounds = YES
Steuerleistung erheblich, was bedeutet, dass die Animation wahrscheinlich stottern wird. Verwenden Sie stattdessen den folgenden Code, um abgerundete Ecken und Schatten zu erhalten UND Animationen oder Bildläufe zu glätten:quelle
Dies ist die Swift 3 und IBDesignable-Version der Antwort von @TheSquad.
Ich habe das gleiche Konzept verwendet, als ich Änderungen an der Storyboard-Datei vorgenommen habe. Zuerst habe ich meine Zielansicht (die Eckradius und Schatten erfordert) in eine neue Containeransicht verschoben . Dann habe ich die folgenden Codezeilen hinzugefügt (Referenz: https://stackoverflow.com/a/35372901/419192 ), um einige IBDesignable-Attribute für die UIView-Klasse hinzuzufügen:
Nachdem ich diesen Code hinzugefügt hatte, kehrte ich zum Storyboard zurück und konnte bei Auswahl meiner containerView im Attributinspektor einen neuen Satz von Attributen finden:
Neben dem Hinzufügen von Werten für diese Attribute gemäß meiner Auswahl habe ich meiner targetView auch einen Eckradius hinzugefügt und die Eigenschaft masksToBounds auf true festgelegt.
Ich hoffe das hilft :)
quelle
Swift 3.0 Version mit StoryBoard
Die gleiche Idee mit @TheSquad. Erstellen Sie eine neue Ansicht unter der tatsächlichen Ansicht und fügen Sie der unteren Ansicht Schatten hinzu.
1. Erstellen Sie eine Ansicht unter der tatsächlichen Ansicht
Ziehen Sie a
UIView
mit der gleichen Einschränkung wie Ihre Zielansicht auf StoryBoard. Aktivieren Sie den zu bindenden Clip für die Zielansicht. Stellen Sie außerdem sicher, dass die neue Ansicht vor der Zielansicht aufgeführt ist, damit die Zielansicht die neue Ansicht abdeckt.2. Verknüpfen Sie nun die neue Ansicht mit Ihrem Code. Fügen Sie Schatten hinzu
Dies ist nur ein Beispiel. Sie können hier tun, was Sie wollen
quelle
Ich hatte auch drastische Leistungsprobleme mit Schatten und abgerundeten Ecken. Anstatt den shadowPath-Teil zu verwenden, habe ich die folgenden Zeilen verwendet, die den Leistungseinbruch perfekt gelöst haben:
quelle
Hier ist eine der Lösungen:
quelle