Tak, tak nie ma ...
Jeśli chcesz zarówno promień naroża i cienia, nie włączać - masksToBounds, ale raczej ustaw promień narożnika i ustaw ścieżkę beziera cienia zaokrągloną prostą. Przechowywać promień dwa takie same:
[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]];
może chcesz sprawdzić swoje wyniki bez parametru -shouldRasterize ustalonym raz ustawiasz ścieżkę cienia. Wydajność rysowania wydaje się bardzo dobra po ustawieniu ścieżki cienia.
UPDATE
ja nie spojrzał na ten problem w dość chwilę, ale wydaje się, że nie ma już potrzeby, aby ustawić shadowPath
aby uzyskać to do pracy. Po prostu ustawienie cornerRadius
i shadowOpacity
będzie działać teraz. Myślę, że tak było, odkąd iOS5 (o ile wiem). Zapewnienie tej aktualizacji jest prawdopodobnie niepotrzebne, ponieważ ustawienie tych parametrów "po prostu działa", ale zapewniam to dla dobra potomności. Reasumując, jest to teraz wszystko, czego potrzebujesz:
[layer setShadowOpacity:0.4];
[layer setCornerRadius:12.0f];
Jeśli trzeba jeszcze lepszą wydajność, można iść do przodu i ustawić parametr shouldRasterize
także:
[layer setShouldRasterize:YES];
A mówiąc o wydajności, warto zauważając, że jeśli zauważysz powolne animacje, będziesz chciał w końcu użyć techniki ustawiania ścieżki cienia. Ta aktualizacja miała na celu tylko wskazanie, że ustawienie ścieżki nie jest już wymagane, aby uzyskać efekt jednoczesnego wyświetlania zarówno promienia rogu, jak i cienia. Jeśli wydajność jest Twoim priorytetem, użyj ścieżki.
UPDATE 2
Ponieważ ludzie wydają się mieć problemy z dostaniem tego, aby pracować w niektórych przypadkach, będę pisać kod pełniejszy fragment tutaj z przykładowego projektu utworzonego:
- (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];
}
The testView
jest UIView dodałem w Interface Builder i ustaw gniazdka na. Ma to na celu upewnienie się, że działa to samo na obu warstwach, które dodajesz jawnie, jak również na warstwy w podspisach.
Testowałem to na symulatorze dla iOS5 do iOS6.1. Daje to wynik dla mnie w każdym z nich:
Czy jest jakiś powód, aby nie ustawić shouldRasterize na TAK? – memmons
To zależy od tego, jak często aktualizujesz warstwę. Jeśli masz zamiar ustawić go raz i nie aktualizować go ponownie, rasteryzacja pomoże uzyskać wydajność, jeśli animujesz warstwę. Jeśli jednak zawartość warstwy jest często aktualizowana, renderuje ją jako obraz za każdym razem, gdy zmieni się zawartość, co może zaszkodzić twojemu przewijaniu (zakładając, że przewijasz/animujesz). –
Potrzebuje miejsca między ścieżkami UIBezierPath i BezierPathWithRoundedRect. –