簡體   English   中英

UITableView滾動變得不穩定

[英]UITableView scrolling becomes choppy

我有一個啟用分頁的UITableView。 首先,我可以在單元格之間非常平滑地滾動。 但是,在來回滾動幾次之后,它變得非常不連貫。 我不能正確創建/重復使用單元嗎?

-  (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cash-Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(20, 40, cell.frame.size.width-40, cell.frame.size.width-40)];
    Purchase *purch = (Purchase *)self.purchases[indexPath.row];
    [image setImage:[UIImage imageWithData:purch.image]];
    image.contentMode = UIViewContentModeCenter;
    image.contentMode = UIViewContentModeScaleAspectFill;
    image.clipsToBounds = YES;
    [self setMaskTo:image byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight];
    [cell addSubview:image];

    UIView *price = [[UIView alloc] initWithFrame:CGRectMake(20, 40+cell.frame.size.width-40, cell.frame.size.width-40, 60)];
    UILabel *priceLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, price.frame.size.width, price.frame.size.height)];
    [priceLabel setText:@"$10.0"];
    [priceLabel setTextAlignment:NSTextAlignmentCenter];
    [priceLabel setFont:[UIFont boldSystemFontOfSize:25.0f]];
    [self setMaskTo:price byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight];
    [price addSubview:priceLabel];
    [price setBackgroundColor:[UIColor whiteColor]];

    [cell addSubview:price];
    return cell;
}

這是因為- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath每次單元格進入視圖時,都會調用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 將圖像添加到數組中(在viewDidLoad或其他位置),您將獲得更平滑的結果。

如果您想重復使用它們,請確保僅將內容添加到UITableViewCell一次,並在重復使用時對其進行更新(例如,相應地更新圖像和價格)。

否則,實現的(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath調用(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath都會添加子視圖的價格和圖像。 只需嘗試調試您的單元必須查看的子視圖數量,看看我是否正確。

您可以這樣:

if ( ! [cell viewWithTag: 1])
{
    UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(20, 40, cell.frame.size.width-40, cell.frame.size.width-40)];
    image.tag = 1;

    image.contentMode = UIViewContentModeCenter;
    image.contentMode = UIViewContentModeScaleAspectFill;
    image.clipsToBounds = YES;
    [self setMaskTo:image byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight];
    [cell addSubview:image];
}

if ( ! [cell viewWithTag: 2])
{
    UIView *price = [[UIView alloc] initWithFrame:CGRectMake(20, 40+cell.frame.size.width-40, cell.frame.size.width-40, 60)];
    UILabel *priceLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, price.frame.size.width, price.frame.size.height)];
    priceLabel.tag = 2;

    [priceLabel setTextAlignment:NSTextAlignmentCenter];
    [priceLabel setFont:[UIFont boldSystemFontOfSize:25.0f]];
    [self setMaskTo:price byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight];
    [price addSubview:priceLabel];
    [price setBackgroundColor:[UIColor whiteColor]];

    [cell addSubview:price];
}
Purchase *purch = (Purchase *)self.purchases[indexPath.row];
UIImage *image = [cell viewWithTag: 1];
[image setImage:[UIImage imageWithData:purch.image]];

UILabel *priceLabel = [cell viewWithTag: 2];
[priceLabel setText:@"$10.0"];

您沒有在重復使用單元格,這會導致滯后/震盪滾動。

建議:

 -  (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

   static NSString *CellIdentifier = @"Cash-Cell";

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

   if(cell == nil){

      UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(20, 40, cell.frame.size.width-40, cell.frame.size.width-40)];
      Purchase *purch = (Purchase *)self.purchases[indexPath.row];
      [image setImage:[UIImage imageWithData:purch.image]];
      image.contentMode = UIViewContentModeCenter;
      image.contentMode = UIViewContentModeScaleAspectFill;
      image.clipsToBounds = YES;
      image.tag = 10;
     [self setMaskTo:image byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight];
     [cell.contentView addSubview:image];

     UIView *price = [[UIView alloc] initWithFrame:CGRectMake(20, 40+cell.frame.size.width-40, cell.frame.size.width-40, 60)];
     UILabel *priceLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, price.frame.size.width, price.frame.size.height)];
    [priceLabel setText:@"$10.0"];
    [priceLabel setTextAlignment:NSTextAlignmentCenter];
    [priceLabel setFont:[UIFont boldSystemFontOfSize:25.0f]];
    [self setMaskTo:price byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight];
    [price addSubview:priceLabel];
    [price setBackgroundColor:[UIColor whiteColor]];
    price.tag = 11;
    [cell.contentView addSubview:price];


 }

//update the value here

  UIImageView *imgV = (UIImageView *)[self.contentView viewWithTag:10];
  // update the imageView here
  //imgV.image = image

  UIView *vv = (UIView *)[self.contentView viewWithTag:11];
  // Update the UIView here
  //vv.text = @"text here";


 //Put setselection style here to allow the cell to be loaded before setting the property value
  cell.selectionStyle = UITableViewCellSelectionStyleNone;

  return cell;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM