如何将uiprogressview绘制到UIView子类中?

时间:2012-03-22 20:43:08

标签: iphone sdk progress-bar cell tableview

我可以使用drawInRect / drawAtPoint绘制字符串/图像。 但是如果我想在这个视图中添加UIProgressView呢?

我正在覆盖drawRect方法,

所以我必须在drawRect中创建UIProgressView吗?


以下更新:

这是我的UITableViewCell子类,用于 Krumelur 的另一个类(仅用于显示我如何进行tableViewCell子类化),我不确定这是否正确,但这是我通常这样做的方式。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {

    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(5.0f,5.0f,40.0f,40.0f)];
//imageView.tag = kImage;
    imageView.layer.cornerRadius = 5.0;
    imageView.layer.masksToBounds = YES;

[self.contentView addSubview:imageView];



nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(55.0f, 5.0f, 220.0f, 18.0f)];
//nameLabel.tag = kName;
nameLabel.font = [UIFont boldSystemFontOfSize:16];
nameLabel.textColor = [[UIColor alloc] initWithRed:18.0/255.0 green:18.0/255.0 blue:18.0/255.0 alpha:1.0f];
    //nameLabel.textColor = [UIColor blackColor];
nameLabel.backgroundColor = [UIColor clearColor];
[self.contentView addSubview:nameLabel];
//[nameLabel release];


    statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(55.0f, 27.0f, 220.0f, 20.0f)];
//lastMessageLabel.tag = kName;
    statusLabel.font = [UIFont systemFontOfSize:13];
statusLabel.textColor = [UIColor colorWithRed:82.0/255.0
                                            green:82.0/255.0
                                             blue:82.0/255.0
                                            alpha:0.8];;
statusLabel.backgroundColor = [UIColor clearColor];
[self.contentView addSubview:statusLabel];
//[lastMessageLabel release];
}

return self;

}

这是我如何在 - (void)cellForRowAtIndexPath

中使用它
static NSString *CellIdentifier = @"RootViewTableCell";

RootViewTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[RootViewTableCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier] autorelease];
}

//cell.backgroundView.backgroundColor = TABLE_BACKGROUND_COLOR;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

User *user = [rows objectAtIndex:indexPath.row];
cell.nameLabel.text = user.name;
cell.statusLabel.text = user.status;

if (user.photo != nil)
{
    //myUser.photo = user.photo;
    cell.imageView.image = user.photo;
} 
else{
    cell.imageView.image = [UIImage imageNamed:@"person_default"];
}
return cell;

我是否必须为每个子视图使用标记?如果我不这样做,我认为没有任何区别。 你看到任何导致tableview滚动滞后的东西吗?因为我以前对我的tableview使用相同的东西。表数据源来自核心数据,NSFetchedResultsController用于任何插入/删除/更新,但我确信我将数据存储到NSMutableArray作为数据源,所以当我滚动tableview时,没有核心数据访问(但仍然是滞后的) )。如果您有任何建议,我很乐意听到,我喜欢这种方式,而不是做UIView子类化然后覆盖drawRect。

感谢

2 个答案:

答案 0 :(得分:1)

重写drawRect方法以在视图中执行自定义绘图。除非您进行自定义绘图,否则不应覆盖此方法,因为这会影响性能。

要显示图片,请考虑使用UIImageView。要显示UIProgressView,请将其添加为子视图,如下所示:

- (void) didMoveToSuperview {
    if(progressView != nil) {
        progressView = [[UIProgressView alloc] initWithFrame:self.bounds];
        [self addSubview:progressView];
    }
}

答案 1 :(得分:1)

您不应该在UITableViewCell中绘制UIProgressView。你通过覆盖UITableViewCell的drawRect来获得性能的原因是因为设备只需要合成第一帧滚动。剩下的时间,它是一个不透明的纹理。

现在您知道为什么获得性能,您可以看到无法将UIProgressView绘制到drawRect中,因为您将更新UIProgressView,这会导致性能降低。 drawRect方法仅适用于静态内容,不适用于具有动画的单元格。

最好的办法是添加子视图,但不要在cellForRowAtIndexPath中将UIProgressView添加为子视图。这将导致许多重复的UIProgressView彼此重叠(由于单元重用)。

你想要做的是(因为你已经是UITableViewCell的子类)在UITableViewCell子类中创建一个UIProgressView属性,将它添加到initWithStyle方法的单元格中,然后在layoutSubviews中重新排列它。