2010-09-09 9 views
18

Byłem bardzo podekscytowany, gdy dowiedziałem się, jak łatwo jest dodawać cienie do moich UIViews na iPhone/iPad.Cień rysunku z kwarcem jest wolny na iPhonie i iPadzie. Inny sposób?

Wystarczy dodać ramy w Xcode, dodać import do początku pliku:

#import <QuartzCore/QuartzCore.h> 

Później:

self.contentView.layer.shadowRadius = 3.0; 
self.contentView.layer.shadowOffset = CGSizeMake(-2.0, -3.0); 
self.contentView.layer.shadowOpacity = 0.5; 
self.contentView.layer.shadowColor = [UIColor blackColor].CGColor; 

Chociaż to robi stworzyć piękny cień w mojej aplikacji, to także opóźnia to do śmierci teraz, gdy widok jest pokazany ... nawet po uruchomieniu poza debuggerem. Czy jest coś, o czym zapominam, czy ta metoda nie jest praktyczna w przypadku większych widoków?

Dla porównania opublikowałem zrzut ekranu here.

Odpowiedz

53

Powinieneś ustawić shadowPath property. W ten sposób CoreGraphics jest w stanie zoptymalizować cienie.

Na przykład, jeśli twój widok jest nieprzejrzysty prostokąt:

self.contentView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.contentView.bounds].CGPath; 
+0

Rzeczywiście, dokładnie tego właśnie szukałem. Dzięki! – Moduspwnens

+0

Dla tych, którzy przybyli tutaj z Google, moglibyście jednak zmienić "self.bounds" na "self.contentView.bounds", aby pasowało do mojego przykładu? – Moduspwnens

+0

@Moduspwnens naprawdę – cobbal

6

Thought I powinny odpowiedzieć, bo nie chce, aby ten klejnot pochowany w komentarzach.

Oprócz powyższej odpowiedzi Cobbana, która bardzo pomogła, occulus wspomniał także o następującej optymalizacji cieni innych niż prostokątne, takich jak cienie tekstowe.

self.contentView.layer.shouldRasterize = YES; 
// Fix visual degradation when rasterizing on high-density screens: 
self.contentView.layer.rasterizationScale = [[UIScreen mainScreen] scale];