2011-06-25 54 views
1

我有下面的代碼,只是創建一個自定義的UITableViewCell。我正在創建一個動態的行高,是否很昂貴?任何方式來優化呢?優化自定義UITableViewCell創建

我也調整了我在cellForRow中的一個標籤的框架。有什麼方法可以優化嗎?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MessageCell *cell = (MessageCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    return cell.bodyLabel.bounds.size.height + 30; 
} 
// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"MessageCell"; 

    MessageCell *cell = (MessageCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    cell.usernameLabel.text = [[items objectAtIndex:indexPath.row]valueForKey:@"user_login"]; 
    cell.bodyLabel.text = [[[items objectAtIndex:indexPath.row]valueForKey:@"body"]gtm_stringByUnescapingFromHTML]; 
    [Utils alignLabelWithTop:cell.bodyLabel]; 
    cell.dateLabel.text = [Utils toShortTimeIntervalStringFromStockTwits:[[items objectAtIndex:indexPath.row]valueForKey:@"created_at"]]; 
    [cell.avatarImageView reloadWithUrl:[[items objectAtIndex:indexPath.row]valueForKey:@"avatar_url"]]; 

    return cell; 
} 
+0

通過定義'myItem = [items objectAtIndex:indexPath.row]'而不是調用它3次,可能會得到很小的改進。 – PengOne

回答

8
  • 動態行的高度是昂貴的,因爲它不能有效地緩存渲染視圖,因爲運行時不知道你會什麼高度來返回給定的細胞,直至它的調用。儘可能擺脫這一點。蘋果工程師告訴我,將所有單元繪製得比所需的高一點,以解決一些較大的行比使用動態高度更有效。
  • 緩存對象由[items objectAtIndex:indexPath.row]
  • 回來我不知道有足夠的瞭解你的cell.avatarImageView,但如果不這樣做基於URL的圖像的一些緩存它,它會被呼喚互聯網或文件系統在每次顯示單元格時重新加載該映像。試試EGOImageView stack,它高效地緩存了它的圖像,並且是一些漂亮的代碼。
  • 當您處於EGO github代碼中時,抓住他們的EGOCache並使用它緩存您必須解析的其他一些值,例如bodyLabel文本
  • 如果您對該單元格的任何視圖都是透明的,觀看關於UIKit性能的WWDC 2011視頻。他們有一個更有效的方法來繪製透視表格單元格
  • 爲什麼你改變標籤的動態定位 - 調用[Utils alignLabelWithTop:]?

同時觀看使用儀器的WWDC視頻,他們會回顧如何找到繪圖代碼在哪裏查殺性能。今年有一些(不是全部)非常棒的會議。

+0

非常豐富的答案!有沒有更好的方式來做具有標準尺寸的動態行高?我正在編寫一個Twitter類型的客戶端,所以它真的會影響UI的差異大小行... –

+0

[Tweetie](http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie- with-uitableview /)走向極端,獲得良好的表現;蘋果發誓,自那時以來,UITableView已經有了很大的改進。但這是一種你可能會嘗試的技巧。如果您可以限制像Twitter這樣的項目中顯示的字符數量,這可能確實有助於提高性能。 – RyanR

+0

Tweetie絕對是FAST。我在動態行上採納了您的建議,並緩存圖像。滾動時不會有太多不一致,但它絕對不像Tweetie。當滾動減速時,它感覺不到活潑嗎?我可能需要做一些自定義繪圖? –