Ja, ja, es gibt ...
Wenn Sie sowohl einen Eckenradius und einen Schlagschatten möchten, können Sie nicht aktivieren - masksToBounds, sondern legen Sie den Eckenradius fest und legen Sie den Bezier-Pfad des Schattens mit einem abgerundeten Rechteck fest. Halten Sie den Radius der beiden gleich:
[layer setShadowOffset:CGSizeMake(0, 3)];
[layer setShadowOpacity:0.4];
[layer setShadowRadius:3.0f];
[layer setShouldRasterize:YES];
[layer setCornerRadius:12.0f];
[layer setShadowPath:
[[UIBezierPath bezierPathWithRoundedRect:[self bounds]
cornerRadius:12.0f] CGPath]];
, Sie möchten die Leistung ohne -shouldRasterize Parameter überprüfen, sobald Sie den Schatten Pfad sind einstellen. Nachdem Sie einen Schattenpfad festgelegt haben, ist die Zeichnungsleistung in der Regel sehr gut.
UPDATE
ich dieses Problem nicht ausgesehen hatte schon eine ganze Weile in, aber es scheint, dass Sie nicht mehr shadowPath
, um diese Arbeit zu bekommen setzen müssen. Einfach die cornerRadius
und shadowOpacity
Einstellung wird jetzt funktionieren. Ich denke das ist seit iOS5 der Fall (soweit ich das beurteilen kann). Die Bereitstellung dieses Updates ist wahrscheinlich unnötig, da das Einstellen dieser Parameter "einfach funktioniert", aber ich werde es für die Nachwelt bereitstellen. Zur Erinnerung, das ist jetzt alles, was Sie brauchen:
[layer setShadowOpacity:0.4];
[layer setCornerRadius:12.0f];
Wenn Sie noch bessere Leistung benötigen, können Sie voran gehen und setzen Sie den shouldRasterize
Parameter auch:
[layer setShouldRasterize:YES];
Und Leistung gesprochen, es lohnt sich Beachten Sie, dass Sie, wenn Sie träge Animationen bemerken, die Technik des Festlegens des Schattenpfads verwenden möchten. Mit diesem Update wurde lediglich darauf hingewiesen, dass das Festlegen des Pfads nicht länger erforderlich ist, um gleichzeitig einen Eckenradius und einen Schatten anzuzeigen. Wenn die Leistung Priorität hat, verwenden Sie einen Pfad.
UPDATE 2
Da die Menschen scheinen Schwierigkeiten zu haben dies immer in einigen Fällen zu arbeiten, ich werde ein vollständigeres Code-Schnipsel hier posten aus einem Beispielprojekt I erstellt:
- (void)viewDidLoad
{
[super viewDidLoad];
CALayer *layer = [CALayer layer];
[layer setBounds:CGRectMake(0.0f, 0.0f, 100.0f, 200.0f)];
[layer setPosition:[[self view] center]];
[layer setBackgroundColor:[[UIColor lightGrayColor] CGColor]];
[layer setShadowOpacity:0.55f];
[layer setCornerRadius:8.0f];
[layer setBorderWidth:1.0f];
[[[self view] layer] addSublayer:layer];
[[[self testView] layer] setShadowOpacity:0.55f];
[[[self testView] layer] setShadowRadius:15.0f];
[[[self testView] layer] setCornerRadius:8.0f];
[[[self testView] layer] setBorderWidth:1.0f];
}
Die testView
ist eine UIView, die ich im Interface Builder hinzugefügt und eine Steckdose eingerichtet habe. Dies stellt sicher, dass es sowohl auf den Ebenen, die Sie explizit hinzufügen, als auch auf den Ebenen in den Unteransichten funktioniert.
Ich habe dies auf den Simulatoren für iOS5 bis iOS6.1 getestet. Es gibt dieses Ergebnis für mich in jedem von ihnen:
Gibt es irgendeinen Grund nicht shouldRasterize auf YES zu setzen? – memmons
Es hängt davon ab, wie oft Sie die Ebene aktualisieren. Wenn Sie es einmal festlegen und nicht erneut aktualisieren möchten, wird die Rasterung beschleunigt, wenn Sie den Layer animieren. Wenn der Inhalt der Ebene jedoch häufig aktualisiert wird, wird dieser Inhalt bei jeder Änderung des Inhalts als Bild dargestellt, was die Scrollleistung beeinträchtigen könnte (vorausgesetzt, Sie scrollen/animieren). –
Benötigt ein Leerzeichen zwischen UIBezierPath und bezierPathWithRoundedRect. –