2012-05-01 64 views
9

我有一個自定義UITableViewCell組成的UIImageView和UILabel。單元格爲320x104px,imageView佔據了前面標籤的整個區域。只有8個電池。自定義UITableViewCell與大UIImageView導致滾動滯後

in ViewDidLoad我正在創建所有需要的圖像,並將它們以正確的尺寸緩存在字典中。

當我滾動UITableView時,每次遇到新單元格時都會出現明顯的延遲。這對我來說沒有任何意義,因爲它正在使用的圖像已經被創建和緩存。我所要求的單元格就是它的UIImageView渲染圖像。

我使用其觀點自定義單元格的廈門國際銀行和配置我的UITableView與使用它:

[self.tableView registerNib:[UINib nibWithNibName:@ 「ActsCell」 捆綁:無] forCellReuseIdentifier: myIdentifier];

細胞創建和配置:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString* reuseIdentifier = @"ActsCell"; 
    ActsCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    // Configure the cell... 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 

- (void)configureCell:(ActsCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    Act* act = [self.acts objectAtIndex:indexPath.row]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.title.text = act.name; 
    cell.imageView.image = [self.imageCache objectForKey:act.uid]; 
} 

可能是什麼造成的滯後呢?隨着所有時間密集型工作的完成,嘗試進行異步操作似乎沒有任何好處。

+0

我能想到兩件事情。一種是出隊失敗,因爲你沒有正確設置'reusableIdentifier'。另一個是圖像的大小。即使圖像被加載,CG需要在顯示之前處理圖像數據,這可能涉及昂貴的操作,如縮放,合成等。 – Lvsti

+0

@Lvsti你能詳細說明我沒有正確設置reuseIdentifier嗎? – Undistraction

+0

你是對的,這可能不是這種情況,否則當出列時你不會得到任何細胞...... – Lvsti

回答

28

你有沒有機會從本地文件加載圖像?

通過使用我發現有在UIImage一些延遲加載機制儀器 - 真實的圖像數據是從PNG僅使其滾動其過程中造成的滯後在主線程的舞臺解壓。

所以,UIImage-initWithContentsOfFile:方法加載後,我已經添加代碼,以使這個圖像屏幕外上下文的內容,保存這方面的新UIImageUITableViewCell用它爲UIImageView,本作的滾動來再次順利和愉快的眼睛。

在參考情況下,存在的簡單代碼我使用強制的在單獨的線程(使用ARC)圖像內容閱讀:

UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path]; 

CGSize imageSize = productImage.size; 
UIGraphicsBeginImageContext(imageSize); 
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)]; 
productImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

我想的UIImage以這樣的方式產生的表面將以適合於渲染的支持格式,這也將減輕在主線程上呈現它所需的工作量。

編輯:UIGraphicsGetImageFromCurrentImageContext()的文檔說它應該只用於主線程,但在網上搜索或SO顯示,從iOS 4開始,UIGraphics..方法變爲線程安全。

+5

這對我來說是非常寶貴的。我一直在使用UIImageViews在每個單元格中顯示一張照片而在UICollectionView上滾動不斷。我嘗試了很多不同的解決方案,但接近60FPS的唯一方法是非常黑客。我嘗試過的大多數解決方案都是使用imageWithContentsOfFile預先載入UIImages的NSCache,但無論我做什麼,總會有一些跳躍,因爲新的單元格出現在屏幕上,直到我在上面實現您的代碼。正如你所說,imageWithContentsOfFile中必須存在某種延遲加載機制,這在文檔中沒有提及。 – alistairholt

+0

這個工作對我來說,在存儲UIImage而不是下載的數據之後會更順暢,然後每次使用它時都會轉換爲UIImage。萬分感謝。 – Envil

+0

一直在尋找這麼慢的原因。你先生是英雄 – user1838169