2013-05-03 91 views
4

我在使用UITableViewCells上的某些子視圖時遇到性能問題。在我繼續滾動之後,它最終開始變得非常緩慢。將UIViews添加到cell時出現UITableView性能問題.contentView

我正在做的第一步是爲每個細胞創建一個共同的UIView,基本上這是創建一個白色細胞,對細胞帶有影子的圓角效果。這種表現似乎是正常的,所以我不認爲它是罪魁禍首。

enter image description here

這裏是我使用這樣做代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     static NSString *NewsCellIdentifer = @"NewsCellIdentifier"; 


     NewsItem *item = [self.newsArray objectAtIndex:indexPath.row]; 


      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NewsCellIdentifer]; 

      if (cell == nil) 
      { 
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NewsCellIdentifer]; 


       cell.contentView.backgroundColor = [UIColor clearColor]; 

       UIView *whiteRoundedCornerView = [[UIView alloc] initWithFrame:CGRectMake(10,10,300,100)]; 
       whiteRoundedCornerView.backgroundColor = [UIColor whiteColor]; 
       whiteRoundedCornerView.layer.masksToBounds = NO; 
       whiteRoundedCornerView.layer.cornerRadius = 3.0; 
       whiteRoundedCornerView.layer.shadowOffset = CGSizeMake(-1, 1); 
       whiteRoundedCornerView.layer.shadowOpacity = 0.5; 

       [cell.contentView addSubview:whiteRoundedCornerView]; 
       [cell.contentView sendSubviewToBack:whiteRoundedCornerView]; 

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

       cell.opaque = YES;  
      } 

      [cell.contentView addSubview:[self NewsItemThumbnailView:item]]; 

      return cell; 
} 

這裏是返回圖形和文字的縮略圖視圖的方法:

- (UIView *) NewsItemThumbnailView:(NewsItem *)item 
{ 
    UIView *thumbNailMainView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 50, 70)]; 
    UIImageView *thumbNail = [[UIImageView alloc] initWithImage:[UIImage imageNamed:item.ThumbNailFileName]]; 
    thumbNail.frame = CGRectMake(10,10, 45, 45); 
    UILabel *date = [[UILabel alloc] init]; 
    date.frame = CGRectMake(10, 53, 45, 12); 
    date.text = item.ShortDateString; 
    date.textAlignment = NSTextAlignmentCenter; 
    date.textColor = [BVColors WebDarkGrey]; 
    CGFloat fontSize = 10.0; 
    date.font = [BVFont Museo:&fontSize]; 

    date.opaque = YES; 
    thumbNail.opaque = YES; 
    thumbNailMainView.opaque = YES; 


    [thumbNailMainView addSubview:thumbNail]; 
    [thumbNailMainView addSubview:date]; 

    return thumbNailMainView; 
} 

的性能問題似乎是當我將縮略圖視圖添加到單元格時發生的,因爲當我將該線條註釋掉時,我似乎沒有它。縮略圖信息是動態的,並隨每個單元格而變化。如果我不應該降低性能,我應該如何做到這一點,我將不勝感激。

+1

通過每次調用此代碼時添加一個子視圖,您正在增加UITableViewCell中的子視圖集合。 dequeing函數創建一個新的表格視圖單元格或抓取現有的單元格。一旦它開始抓取現有的單元格,就會在現有的UIImageView上添加一個UIImageView。其結果是你將成倍地增加需要爲每個單元渲染的UIImageViews。這會大大降低您的應用程序的速度。我喜歡下面的jszumski答案。 – Rob 2013-05-03 20:09:57

回答

2

我最終撬動解決這個計算器後發現:

How should I addSubview to cell.contentView?

本質上講,當電池第一次初始化我設置的觀點由提到NISHANT;然而,一旦單元格被重用,我將提取出需要更改的項目,例如UIImageView,然後是UILabel。由於這些是指針,我可以在需要時修改我需要的內容,並且性能又快又快。這是我所做的一個縮寫版本。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *NewsCellIdentifer = @"NewsCellIdentifier"; 

    NewsItem *item = [self.newsArray objectAtIndex:indexPath.row]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NewsCellIdentifer]; 


    UIView *thumbNailMainView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 50, 70)]; 
    UIImageView *thumbNail; 

    UIView *textMainView = [[UIView alloc] initWithFrame:CGRectMake(20,20,80,80)]; 
    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(52,-5, 70, 20)]; 
    UILabel *teaserLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,20, 210, 40)]; 

    UIView *newsItemCornerMainView = [[UIView alloc] initWithFrame:CGRectMake(255.7, 55.2, 55, 55)]; 
    UIImageView *cornerIconView; 

    // If the cell doesn't existing go ahead and make it fresh. 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NewsCellIdentifer]; 


     // Configure all the various subviews 

     ..... //Sample below 

     // Make the title view 
     headerLabel.text = item.Title; 
     CGFloat textfontSize = 16.0f; 
     headerLabel.font = [BVFont Museo:&textfontSize]; 
     headerLabel.textColor = [BVColors WebBlue]; 
     headerLabel.textAlignment = NSTextAlignmentLeft; 
     headerLabel.numberOfLines = 0; 
     headerLabel.tag = 50; 
     // Make the Teaser view 
     teaserLabel.text = item.Teaser; 
     teaserLabel.numberOfLines = 0; 
     CGFloat tfontSize = 13.0f; 
     teaserLabel.textAlignment = NSTextAlignmentLeft; 
     teaserLabel.textColor = [BVColors WebDarkGrey]; 
     teaserLabel.font = [BVFont HelveticaNeue:&tfontSize]; 
     [teaserLabel sizeToFit]; 
     teaserLabel.tag = 51; 
     [textMainView addSubview:headerLabel]; 
     [textMainView sendSubviewToBack:headerLabel]; 
     [textMainView addSubview:teaserLabel]; 
     [cell.contentView addSubview:textMainView]; 

     .... 
    } 

    thumbNail = (UIImageView *) [cell viewWithTag:47]; 
    [thumbNail setImage:[UIImage imageNamed:item.ThumbNailFileName]]; 

    headerLabel = (UILabel *) [cell viewWithTag:50]; 
    headerLabel.text = item.Title; 
    teaserLabel = (UILabel *) [cell viewWithTag:51]; 
    teaserLabel.text = item.Teaser; 

    cornerIconView = (UIImageView *) [cell viewWithTag:48]; 
    [cornerIconView setImage:[UIImage imageNamed:item.CornerIconFileName]]; 

    return cell; 
} 
1

您應該每次只更改thumbNailMainView內容,但不應每次將其內容添加到單元格中。

所以加入這一行你在哪裏分配單元

[cell.contentView addSubview:[self NewsItemThumbnailView:item]]; 

添加此括號括起來的。然後從單元格訪問thumbNailMainView並傳遞您需要爲每個單元格更改的項目數據。

分配標籤thumbNailMainView及其子視圖thumbNail然後訪問它

UIView *_thumbNailMainView = [cell.contentView viewWithTag:_thumbNailMainView_tag]; 
UIImageView *_thumbNail = [_thumbNailMainView viewWithTag:thumbNail_tag]; 
_thumbNail.image = [UIImage imageNamed:item.ThumbNailFileName]; 

希望它可以幫助你。

+0

謝謝,這有助於我帶領最終的解決方案! – Flea 2013-05-03 21:46:35

+0

最受歡迎。標記這個答案,如果它可以幫助你。 – 2013-05-03 21:54:22

5

UITableView將在每次單元進入視圖時調用tableView:cellForRowAtIndexPath:,並且dequeueReusableCellWithIdentifier:將重用現有單元對象(如果它們可用)。這兩個事實相結合,將您置於每次滾動時的場景中,同樣有限數量的單元格對象最終會以越來越多的子視圖出現。

正確的做法是創建一個具有thumbnailView屬性的自定義UITableViewCell子類。在該屬性的設置器中,刪除先前的縮略圖(如果有的話),然後將新的縮略圖添加到contentView。這可確保您隨時只能擁有一個縮略圖子視圖。

非最佳的方法是增加一個標籤從NewsItemThumbnailViewthumbNailMainView.tag = someIntegerConstant)返回的UIView,然後搜索與該標記的任何視圖並將另一前將其取出:

// remove old view 
UIView *oldThumbnailView = [cell.contentView viewWithTag:someIntegerConstant]; 
[oldThumbnailView removeFromSuperview]; 

// add new view 
[cell.contentView addSubview:[self NewsItemThumbnailView:item]]; 
+0

謝謝,這有助於我帶領最終的解決方案! – Flea 2013-05-03 21:47:17

相關問題