2012-03-29 75 views
6

我有一個UITableView,每個單元有三個UIImageView視圖,同時在視圖上顯示三個單元(總共九個UIImageView視圖)。把它想象成一個書架。有時我可以有多達500本書。向UITableView上的UIImageView添加陰影會導致性能下降...爲什麼?

我已經添加陰影到UIImageView與代碼是這樣的:

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

當我添加陰影代碼,從上面可以看出,滾動性能只是完全死亡,變成波濤洶涌。每個圖像都有一個不同的Rect,因此每個項目滾動時都必須創建陰影。任何人有任何提示如何在UITableView的影像上添加陰影而不會出現此問題?

+0

我在這裏回答了類似的問題:http://stackoverflow.com/a/10133182/242769 – aryaxt 2014-10-31 18:22:03

回答

0

您是否激活重複使用?如果不是,則每當視圖改變時(例如,在滾動期間),單元格將重新進行。那肯定會吃很多的表演。

+0

是的,我確實有重用 – 2012-03-29 21:29:28

9

您可能會看到性能提升,如果你添加

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

但在一般情況下,像這樣的層操作將殺死在表視圖中的表現。我遇到了完全相同的問題,我們只是消除了陰影效應。這不值得。

+0

它的工作原理,但影子在視圖的所有4個方面分配.. – NSPratik 2016-04-21 11:01:42

1

陰影很貴,會殺死你的表現。

更好的方法是在後臺渲染陰影圖像,緩存/保存並在準備就緒時將其顯示在視圖上。

編輯:你想看看核心圖形/ CGImage例程。具體CGContextSetShadowWithColor會給你一個陰影。

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

+0

你說您的視圖看起來像一個書架 - 至少對我來說,這意味着所有帶陰影的東西都是矩形的(可能大小相同)。在這種情況下,重複使用相同的陰影圖像肯定聽起來像是要走的路。 (如果你的矩形不是全部相同的大小,你仍然可以在UIImage的可調整大小的圖像支持下重用圖像。) – rickster 2012-03-29 19:47:09

+0

它不一定需要是矩形。可以將陰影圖像渲染到任意前景,然後渲染任意背景的頂部。我建議緩存圖像三明治(前景,陰影,背景) – lorean 2012-03-29 20:19:18

+0

感謝rickster ...我所有的圖像都是矩形的。我會給這個鏡頭,並根據需要調整它的大小,並看看它的外觀。 – 2012-03-29 21:25:56

3

你應該檢討CoreAnimation最佳實踐的WWDC視頻。您可以請求將光柵化的陰影副本緩存在內存中。可可絕對快得足以在飛行中呈現這些陰影,而不會回落到預先呈現的圖像。

例子:

itemImageView.layer.shouldRasterize = YES; 

而且我上投關於UIBezierPath答案。在最佳實踐中也提到了這一點,但設置CALayer的陰影路徑是一個巨大的性能提升。您還可以通過操縱陰影路徑來創建一些有趣的特效。

+1

添加shouldRasterize = YES絕對殺死了圖像質量。任何想法爲什麼? – 2012-03-29 21:29:00

+0

它將爲層次結構中的所有圖層重新使用一個光柵化圖像。你是否也設置了陰影路徑來改善圖像質量? – Sam 2012-03-30 15:42:21

+3

如果圖層質量降低,可能需要添加以下代碼:self.rasterizationScale = [[UIScreen mainScreen] scale] – capikaw 2014-01-04 23:15:27

0

看看我這裏同樣的問題:App running slowly because of UIImageViews

我會使用此代碼:

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

我有添加陰影標籤一個tableviewcell內同樣的問題。我試圖佈局內的cellForRowAtIndexPath的元素時,細胞就會被創建:

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

這些優化的滾動一點點,但它很不穩定。

爲了優化您的圖片質量,您應該還添加rasterizationScale如果激活「shouldRasterize」:

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

也許有人有一些想法如何優化代碼,以獲得正常的iOS滾動。 THX

相關問題