2012-02-17 14 views
9

Mam poniższy układ stylu menu, który naśladuje facebook. Chciałbym mieć cień po lewej stronie, jak poniżej, ale kod, którego używam z cieniami warstwowymi powoduje, że aplikacja LAGGY. Nie byłem w stanie znaleźć dobrego alternatywnego rozwiązania. Czy ktoś ma alternatywę do tworzenia cienia, który nie wpływa na wydajność aplikacji?iOS: Twórz jednostronne cieniowanie

[self.navController.view.layer setShadowOffset:CGSizeMake(0, 1)]; 
[self.navController.view.layer setShadowColor:[[UIColor darkGrayColor] CGColor]]; 
[self.navController.view.layer setShadowRadius:8.0]; 
[self.navController.view.layer setShadowOpacity:0.8]; 

Powyższy kod jest aktualnie używanym kodem, który powoduje problemy z wydajnością aplikacji.

Poniższe zdjęcie jest tym, co chciałbym osiągnąć, ale bez konieczności stosowania powyższego kodu.

enter image description here

Odpowiedz

10

Powinno pomóc określić ścieżkę cień np

CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:self.navController.view.layer.bounds].CGPath; 
[self.navController.view.layer setShadowPath:shadowPath] 

Według CALayer documentation „Określanie wyraźną ścieżkę zwykle poprawia wydajność renderowania.”

+0

Awesome! to pomogło dużo, ale zauważyłem trochę wydajności, ale nie na złe. – Bot

0

Ja sam dodałabym tylko UIView zawierający ten cień jako wyeksportowany i przesunąć go, gdy tylko widok po prawej stronie zostanie animowany. (Np narysować ten cień z warstwami lub Core Graphics)

+0

Dodanie zbyt wielu widoków spowoduje zmniejszenie znajomości wydajności –

4

można po prostu wpuszczanych poglądy granicach i ustawić ścieżkę shadow:

UIEdgeInsets contentInsets = UIEdgeInsetsMake(10, 0, 0, 0); 
CGRect shadowPathExcludingTop = UIEdgeInsetsInsetRect(self.bounds, contentInsets); 
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowPathExcludingTop].CGPath;