iPhone - UITableView 性能不佳,每个单元格中都有 UIImageViews 的 UIScrollVi



我有一个包含UIScrollViewUITableViewCell。 UIScrollView 包含每行的不同数量的UIImageViews。 有些行在滚动视图中有 5 个图像,有些行在滚动视图中有 15 个图像。 由于每行的UIImageViews数不同,因此在绘制每行时,我无法分配新的UIImageViews! 这显然对我UITableView的滚动性能产生了负面影响。 如何解决此问题以改善UITableView滚动?

此外,使用仪器的时间分析器,我注意到方法调用[tableView dequeueReusableCellWithIdentifier:MyIdentifier]异常慢。 这是否有助于指出问题所在?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"HuddleTableCell";
HuddleListItemTableViewCell *cellToReturn = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cellToReturn == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"HuddleListItemTableViewCell" owner:self options:nil];
    cellToReturn = cell;
    UILabel *badgeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    badgeLabel.font = [UIFont boldSystemFontOfSize:16];
    badgeLabel.numberOfLines = 2;
    badgeLabel.textAlignment = UITextAlignmentCenter;
    badgeLabel.textColor = [UIColor whiteColor];
    badgeLabel.backgroundColor = [UIColor clearColor];
    [cellToReturn.attendee4Image addSubview:badgeLabel];
    cellToReturn.othersOverlayLabel = badgeLabel;
    [badgeLabel release];
    cellToReturn.heartHolderView.layer.cornerRadius = 5;
    cellToReturn.heartHolderView.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:.29 green:.39 blue:.57 alpha:1.0] CGColor],(id)[[UIColor colorWithRed:.19 green:.22 blue:.36 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:.102 green:.122 blue:.17 alpha:1.0] CGColor], nil];
    cellToReturn.heartHolderView.colors = [NSArray arrayWithObjects:(id)[UIColorFromRGB(0x4A59A8) CGColor], nil];
    cellToReturn.heartHolderView.layer.cornerRadius = 5.0;
    UIView *polaroidView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 37, 39)];
    polaroidView.layer.shadowColor = [UIColor blackColor].CGColor;
    polaroidView.layer.shadowOpacity = 0.3;
    polaroidView.layer.shadowRadius = 1;
    polaroidView.layer.shadowOffset = CGSizeMake(5.0f, 5.0f);
    polaroidView.backgroundColor = [UIColor whiteColor];
    UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(4, 4, 29, 29)];
    [polaroidView addSubview:img];
    [cellToReturn.organizerImage addSubview:polaroidView];
    cellToReturn.polaroidView = polaroidView;
    cellToReturn.polaroidImageView = img;
    [img release];
    [polaroidView release];
    cellToReturn.gradientView.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor],(id)[[UIColor colorWithRed:.96 green:.96 blue:.96 alpha:1.0] CGColor],(id)[[UIColor colorWithRed:.85 green:.85 blue:.85 alpha:1.0] CGColor], nil];
    cellToReturn.votingTimerLabel.textColor = UIColorFromRGB(0x616163);
    cellToReturn.eventDateLabel.textColor = UIColorFromRGB(0x616163);
    cellToReturn.eventNameLabel.textColor = UIColorFromRGB(0x616163);
    cellToReturn.numInviteesLabel.textColor = UIColorFromRGB(0x616163);
    cellToReturn.numVotesLabel.textColor = UIColorFromRGB(0x616163);
    self.cell = nil;
}
NSString *organizerFbId = [[self.huddleList objectAtIndex:indexPath.row]objectForKey:@"userId"];
[cellToReturn.polaroidImageView setImageWithURL:[self.organizerImageUrls objectForKey:organizerFbId] placeholderImage:self.placeholderImage];
[[cellToReturn.imageScrollViewHolder subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
if ([self.avatarScrollViews objectForKey:[[self.huddleList objectAtIndex:indexPath.row]objectForKey:@"id"]]) {
    [cellToReturn.imageScrollViewHolder addSubview:[self.avatarScrollViews objectForKey:[[self.huddleList objectAtIndex:indexPath.row]objectForKey:@"id"]]];
} else {
    UIScrollView *tempImageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, 46)];
    tempImageScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    NSArray *fbUids = [[self.huddleList objectAtIndex:indexPath.row] objectForKey:@"facebookInvitees"];
    int i=0;
    for (i=0;i < [fbUids count];i++) {
        UIView *polaroidView = [[[UIView alloc] initWithFrame:CGRectMake((i * 45) + (3 * i), 0, 37, 39)] autorelease];
        polaroidView.layer.shadowColor = [UIColor blackColor].CGColor;
        polaroidView.layer.shadowOpacity = 0.3;
        polaroidView.layer.shadowRadius = 1;
        polaroidView.layer.shadowOffset = CGSizeMake(5.0f, 5.0f);
        polaroidView.backgroundColor = [UIColor whiteColor];
        UIImageView *img = [[[UIImageView alloc] initWithFrame:CGRectMake(4, 4, 29, 29)] autorelease];
        [img setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://graph.facebook.com/%@/picture", [fbUids objectAtIndex:i]]] placeholderImage:self.placeholderImage];
        [polaroidView addSubview:img];
        [tempImageScrollView addSubview:polaroidView];
    }
    [tempImageScrollView setContentSize:CGSizeMake((i*45) + (3 * i), 46)];
    [self.avatarScrollViews setObject:tempImageScrollView forKey:[[self.huddleList objectAtIndex:indexPath.row]objectForKey:@"id"]];
    [cellToReturn.imageScrollViewHolder addSubview:tempImageScrollView];
    [tempImageScrollView release];
}
return cellToReturn;
}

即使每个单元格的滚动条中有固定数量的图像,当单元格取消排队和重复使用时,您也会被困在分配它们的位置。 获得速度的方法是占用更多空间,方法是将单元格的子视图保留在表外的数组中。

创建另一个与 huddleList 数组计数相同的数组。 用包含 imageView 的 UIScrollViews 填充该数组。 cellForRowAtIndexPath 方法中的所有代码都可以移动到新数组的初始化方法,并替换为几行简单的代码:

// dequeue or build a cell
// tag the scroll views so you can find them
UIScrollView *oldScrollView = (UIScrollView *)[cell viewWithTag:kCELL_SCROLL_VIEW];
// this might be a reused cell, so remove the scroll view if it has one
if (oldScrollView) [oldScrollView removeFromSuperview];
// now add the one that you setup for this cell
// your init code that used to be in this method sets up the frame, the tag, etc
UIScrollView *currentScrollView = [self.cachedScrollViews objectAtIndex:indexPath.row];
[cell addSubview:currentScrollView];
// that's it

不要忘记释放缓存的内存滚动视图警告

最新更新