2012-03-29 32 views
6

Tôi có một số UITableView có ba chế độ xem UIImageView mỗi ô, với ba ô hiển thị trên cùng một lượt xem (với tổng số là chín UIImageView lượt xem). Hãy nghĩ về nó như một kệ sách. Đôi khi tôi có thể có tới 500 cuốn sách.Đã thêm bóng vào UIImageView trên UITableView sẽ giết hiệu suất ... tại sao?

Tôi đã thêm shadow cho UIImageView với mã mà là thế này:

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]; 

Khi tôi thêm mã bóng, như đã thấy ở trên, hiệu suất di chuyển chỉ là hoàn toàn thiệt mạng và trở thành choppy. Mỗi hình ảnh có một khác nhau Rect do đó bóng phải được tạo ra cho mỗi mục khi nó cuộn. Bất cứ ai cũng có bất kỳ lời khuyên về cách thêm bóng tối cho hình ảnh của tôi trên một UITableView mà không có vấn đề này?

+0

Tôi đã trả lời một câu hỏi tương tự tại đây: http://stackoverflow.com/a/10133182/242769 – aryaxt

Trả lời

0

Bạn có kích hoạt sử dụng lại không? Nếu không, các ô sẽ làm lại mỗi khi thay đổi chế độ xem (ví dụ: trong khi cuộn). Điều đó sẽ ăn rất nhiều hiệu suất cho chắc chắn.

+0

Có, tôi đã sử dụng lại –

9

Bạn có thể thấy một sự cải thiện hiệu suất nếu bạn thêm

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

Nhưng nói chung, hoạt động lớp như thế này sẽ giết hiệu suất trong một cái nhìn bảng. Tôi đã trải nghiệm chính xác cùng một vấn đề và chúng tôi đã loại bỏ hiệu ứng đổ bóng. Nó không đáng đâu.

+0

Nó hoạt động nhưng bóng được gán ở tất cả 4 mặt của chế độ xem .. – NSPratik

1

Bóng là tốn kém và sẽ giết hiệu suất của bạn.

Cách tiếp cận tốt hơn là hiển thị hình ảnh ẩn trong nền, lưu/lưu bộ nhớ cache và hiển thị nó trên màn hình khi sẵn sàng.

Chỉnh sửa: Bạn muốn xem đồ họa Core/CGImage. Cụ thể CGContextSetShadowWithColor sẽ vẽ bóng cho bạn.

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

+0

Bạn nói xem của bạn trông giống như một kệ sách - với tôi ít nhất, ngụ ý rằng tất cả mọi thứ với một cái bóng là hình chữ nhật (và có lẽ cùng kích thước). Việc tái sử dụng cùng một hình ảnh bóng chắc chắn giống như cách để đi trong trường hợp đó. (Và nếu hình chữ nhật của bạn không phải là tất cả cùng kích thước, bạn vẫn có thể sử dụng lại hình ảnh với hỗ trợ hình ảnh có thể thay đổi kích thước của UIImage.) – rickster

+0

Nó không nhất thiết phải là hình chữ nhật. Có thể tạo ra một hình ảnh bóng tối trên một nền trước tùy ý sau đó hiển thị ontop của một nền tùy ý. Những gì tôi đề nghị là bộ nhớ đệm hình ảnh bánh sandwich (foreground, bóng tối, nền) – lorean

+0

Cảm ơn rickster ... tất cả các hình ảnh của tôi là hình chữ nhật. Tôi sẽ cung cấp cho một shot và chỉ cần thay đổi kích thước nó khi cần thiết và xem nó trông như thế nào. –

3

Bạn nên xem lại các đoạn video WWDC trên thực hành tốt nhất CoreAnimation. Bạn có thể yêu cầu bản sao rasterized của bóng được lưu trữ trong bộ nhớ. Ca cao chắc chắn là đủ nhanh để hiển thị các bóng này một cách nhanh chóng mà không quay trở lại hình ảnh được hiển thị trước.

Ví dụ:

itemImageView.layer.shouldRasterize = YES; 

Ngoài ra tôi lên-bình chọn câu trả lời liên quan đến UIBezierPath. Điều này cũng được đề cập trong các thực hành tốt nhất, nhưng thiết lập đường dẫn bóng của một CALayer là một sự tăng hiệu suất rất lớn. Bạn cũng có thể tạo ra một số hiệu ứng đặc biệt thú vị bằng cách thao tác với đường dẫn bóng.

+1

Thêm shouldRasterize = YES hoàn toàn làm giảm chất lượng hình ảnh. Bất kỳ ý tưởng tại sao? –

+0

Nó đang tái sử dụng một hình ảnh rasterized cho tất cả các lớp trong hệ thống phân cấp. Bạn cũng đã thiết lập đường dẫn bóng để cải thiện chất lượng hình ảnh chưa? – Sam

+3

Nếu chất lượng của lớp bị suy giảm, có khả năng b/c bạn cần phải thêm mã: self.rasterizationScale = [[Thang đo [UIScreen mainScreen]] – capikaw

0

Check-out cùng một câu hỏi của tôi ở đây: App running slowly because of UIImageViews

Tôi sẽ sử dụng mã này:

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

Tôi có cùng một vấn đề với việc thêm bóng tối để nhãn bên trong một tableviewcell. Tôi cố gắng để bố trí các yếu tố bên trong cellForRowAtIndexPath khi các tế bào sẽ được tạo:

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

Những tối ưu hóa di chuyển một chút, nhưng nó khá choppy.

Đối với việc tối ưu hóa chất lượng hình ảnh của bạn, bạn nên thêm cũng là rasterizationScale nếu bạn kích hoạt "shouldRasterize":

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

Có lẽ ai đó có một số ý tưởng làm thế nào để tối ưu hóa mã để có được iOS bình thường di chuyển. thx

Các vấn đề liên quan