0

我有一个UITableViewCell包含一个UIScrollView. UIScrollView 包含不同数量的UIImageViews每一行。有些行在滚动视图中有 5 个图像,有些行在滚动视图中有 15 个图像。由于每行中的数量不同,所以在绘制每一行时UIImageViews我都坚持分配新的!UIImageViews这显然对我的UITableView. 我该如何解决这个问题以改善UITableView滚动?

此外,使用 Instruments 的 Time Profiler,我注意到方法调用[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;
}
4

1 回答 1

0

即使每个单元格的滚动条中有固定数量的图像,当单元格出列并重用时,您也会被困在分配它们的过程中。获得速度的方法是通过将单元格的子视图保存在表格外部的数组中来占用更多空间。

创建另一个与 huddleList 数组具有相同计数的数组。用包含 imageViews 的 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

不要忘记在内存警告上释放 cachedScrollViews

于 2012-04-06T04:50:55.180 回答