2012-03-29 14 views
6

Mam UITableView, który ma trzy widoki UIImageView na komórkę, z trzema komórkami wyświetlającymi się w tym samym czasie (łącznie dziewięć widoków: UIImageView). Pomyśl o tym jak o półce z książkami. Czasami mogę mieć nawet 500 książek.Dodano cień do UIImageView na wydajność UITableView zabija ... dlaczego?

Dodałem cień do UIImageView z kodem, który brzmi następująco:

UIImageView *itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(25, 7, 65, 75)]; 
itemImageView.contentMode = UIViewContentModeScaleAspectFit; 
itemImageView.tag = 6; 
itemImageView.layer.shadowColor = [UIColor blackColor].CGColor; 
itemImageView.layer.shadowOffset = CGSizeMake(3, -1); 
itemImageView.layer.shadowOpacity = 0.7; 
itemImageView.layer.shadowRadius = 3.0; 
itemImageView.clipsToBounds = NO; 
[cell.contentView addSubview:itemImageView]; 

Kiedy dodać kod cień, jak widać powyżej, wydajność przewijania jest po prostu całkowicie zabity, a staje się niepewny. Każdy obraz ma inną wartość niż Rect, więc cień musi zostać utworzony dla każdego przedmiotu podczas jego przewijania. Ktoś ma jakieś wskazówki, w jaki sposób dodać cienie do moich obrazów na UITableView bez tego problemu?

+0

Odpowiedziałem na podobne pytanie tutaj: http://stackoverflow.com/a/10133182/242769 – aryaxt

Odpowiedz

0

Czy aktywujesz ponowne używanie? Jeśli nie, komórki zostaną ponownie wygenerowane za każdym razem, gdy zmieni się widok (np. Podczas przewijania). Na pewno przydałoby się to dużo.

+0

Tak, ponownie używam –

9

może pojawić się wzrost wydajności jeśli dodać

itemImageView.layer.shadowPath = 
     [UIBezierPath bezierPathWithRect:itemImageView.layer.bounds].CGPath; 

Ale w ogóle, operacje warstwy jak to zabije wydajność w widoku tabeli. Doświadczyłem dokładnie tego samego problemu i po prostu wyeliminowaliśmy efekt cienia. To nie było tego warte.

+0

Działa, ale cień jest przypisany do wszystkich 4 boków widoku .. – NSPratik

1

Cienie są drogie i zabiją Twoją wydajność.

Lepszym rozwiązaniem jest renderowanie zacienionego obrazu w tle, zapisywanie w pamięci podręcznej/zapisywanie i wyświetlanie go w widoku, gdy jest gotowy.

Edycja: Chcielibyście spojrzeć na procedury Core Graphics/CGImage. W szczególności CGContextSetShadowWithColor narysuje cień.

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html

+0

Mówisz twój widok wygląda jak półka z książkami - przynajmniej dla mnie oznacza to, że wszystko z cieniem ma kształt prostokątny (i prawdopodobnie ten sam rozmiar). Ponowne użycie tego samego obrazu cienia zdecydowanie brzmi jak droga w tym przypadku. (Jeśli twoje prostokąty nie mają tego samego rozmiaru, możesz ponownie użyć tego obrazu przy pomocy zmiennej rozdzielczości UIImage.) – rickster

+0

To niekoniecznie musi być prostokątne. Możliwe jest renderowanie obrazu cienia na dowolnym planie, a następnie renderowanie tego obiektu z dowolnego tła. Co sugeruję jest buforowanie obrazu kanapkę (pierwszy plan, cień, tło) – lorean

+0

Dzięki Rickster ... wszystkie moje obrazy są prostokątne. Postaram się to zrobić i po prostu zmienić rozmiar w razie potrzeby i zobaczyć, jak to wygląda. –

3

Należy dokonać przeglądu filmów WWDC na CoreAnimation najlepszych praktyk. Możesz poprosić, aby zrasteryzowana kopia cienia została zapisana w pamięci podręcznej. Kakao jest zdecydowanie wystarczająco szybkie, aby renderować te cienie w locie, nie cofając się do wcześniej renderowanego obrazu.

Przykład:

itemImageView.layer.shouldRasterize = YES; 

Również up-głosowało odpowiedź dotyczącą UIBezierPath. Jest to również wspomniane w najlepszych praktykach, ale ustawienie ścieżki cienia dla CALayera to ogromny wzrost wydajności. Możesz również tworzyć ciekawe efekty specjalne, manipulując ścieżką cienia.

+1

Dodawanie shouldRasterize = YES całkowicie zabiło jakości obrazu. Jakieś pomysły, dlaczego? –

+0

Powoduje ponowne użycie jednego zrasteryzowanego obrazu dla wszystkich warstw w hierarchii. Czy ustawiłeś również ścieżkę cieniowania, aby poprawić jakość obrazu? – Sam

+3

Jeśli jakość warstwy ulegnie pogorszeniu, najprawdopodobniej b/c musisz dodać kod: self.rasterizationScale = [[UIScreen mainScreen] scale] – capikaw

0

Sprawdź moje samo pytanie tutaj: App running slowly because of UIImageViews

Chciałbym użyć tego kodu:

imageView.layer.masksToBounds = NO; 
UIBezierPath *path = [UIBezierPath imageView.bounds]; 
imageView.layer.shadowPath = path.CGPath; 
0

Mam ten sam problem z dodaniem cień do etykiet wewnątrz tableviewcell. Próbowałem układ elementów wewnątrz cellForRowAtIndexPath gdy komórka zostanie utworzony:

if(cell == nil){ 
    //layout cell 

Są zoptymalizowane przewijanie trochę, ale jest dość niepewny.

Dla optymalizacji jakości zdjęcia należy dodać również rasterizationScale jeśli aktywna „shouldRasterize”:

aLabel.layer.shouldRasterize = YES; 
aLabel.layer.rasterizationScale = [[UIScreen mainScreen] scale]; 

Może ktoś ma jakieś pomysły, jak zoptymalizować kod, aby uzyskać normalne iOS przewijania. thx