1

我通过 UIImageView 设置 UIImage 作为子类 UITableViewCell 的背景视图,如下所示:

-(void)awakeFromNib {

UIImage *backImg = [[UIImage imageNamed:@"CellBackground"]  
                    resizableImageWithCapInsets:UIEdgeInsetsMake(16, 132, 16, 16)];
UIImageView *imv = [[UIImageView alloc] initWithImage:backImg];
self.backgroundView = imv;

}

这非常有效,每个单元格的高度不同(通过 heightForRowAtIndexPath 暴露,它计算带有文本的 UILabel 的高度),并且背景图像根据我想要的单元格调整大小。

但是,当我旋转设备时,视图会在旋转过程中挂起,并且需要 5-10 秒才能在风景中重绘,或者崩溃而没有错误。如果我从背景视图中删除这个图像视图,旋转效果很好。模拟器和设备。

[编辑] 或者,我将 imageview 添加为 cell.contentView 的子视图 - 性能更好,但仍然滞后。

UIImage *backImg = [[UIImage imageNamed:@"CellBackground"]  
                    resizableImageWithCapInsets:UIEdgeInsetsMake(16, 132, 16, 16)];
UIImageView *imv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
imv.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
imv.image = backImg;

[self.contentView addSubview:imv];

另外,如上所述,我的 UITableViewCell 是一个子类。上面的代码在 awakeFromNib 中,我正在加载我的 UITableViewCell,如下所示:

// within initWithNibName: of UIViewcontroller:

cellLoader = [UINib nibWithNibName:@"MasterTableViewCell" bundle:[NSBundle mainBundle]];

// and UITableView method:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    MasterTableViewCell *cell = (MasterTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MasterTableViewCell"];
    if (cell == nil) {
        NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
        cell = [topLevelItems objectAtIndex:0];
    }
    return cell;
}

难道我做错了什么?有什么提示吗?

4

1 回答 1

1

每次绘制单元格时都调用它吗?这真的会损害你的表现。我建议只在绘制新单元格时这样做。所以它看起来像

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell == nil) 
{
    UIImage *backImg = [[UIImage imageNamed:@"CellBackground"]  
                resizableImageWithCapInsets:UIEdgeInsetsMake(16, 132, 16, 16)];
    UIImageView *imv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    imv.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    imv.image = backImg;

    [self.contentView addSubview:imv];
}
于 2012-05-09T22:45:13.653 回答