как нарисовать uiprogressview в подклассе UIView? - PullRequest
0 голосов
/ 23 марта 2012

Я могу нарисовать строку / изображение ... с drawInRect / drawAtPoint. но как насчет того, если я хочу добавить UIProgressView в это представление?

Я переопределяю метод drawRect,

так что мне нужно создать UIProgressView внутри drawRect?


ОБНОВЛЕНО НИЖЕ:

Вот мой подкласс UITableViewCell для другого класса (просто для того, чтобы показать, как я делал подклассы tableViewCell) для Krumelur , я не уверен, правильно ли это, но я обычно так делаю.

- (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;

Должен ли я использовать тег для каждого подпредставления? я не вижу никакой разницы, если я не Вы видите что-нибудь, что вызывает задержку прокрутки таблицы? потому что я использую то же самое для моего стола раньше. источник данных таблицы взят из базовых данных и NSFetchedResultsController для любой вставки / удаления / обновления, но я уверен, что я храню данные в NSMutableArray в качестве источника данных, поэтому при прокрутке табличного представления нет доступа к основным данным (но все еще запаздывает ). Пожалуйста, если у вас есть какие-либо предложения, я хотел бы услышать, и мне нравится этот способ больше, чем делать подклассы UIView, а затем переопределить drawRect.

спасибо

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Вы не должны рисовать UIProgressView в UITableViewCell. Причина, по которой вы повышаете производительность, переопределяя drawRect UITableViewCell, заключается в том, что устройству нужно только составить первый кадр прокрутки. В остальное время это единственная непрозрачная текстура.

Теперь вы знаете, почему вы повышаете производительность, вы можете видеть, что вы не можете нарисовать UIProgressView в drawRect, потому что вы собираетесь обновлять этот UIProgressView, что приводит к снижению производительности. Метод drawRect предназначен только для статического содержимого и не предназначен для ячеек с анимацией.

Лучше всего добавить AddSubview, но не добавляйте UIProgressView в качестве подпредставления в cellForRowAtIndexPath. Это приведет к тому, что множество дублирующихся UIProgressViews будут перекрывать друг друга (из-за повторного использования ячейки).

То, что вы хотите сделать, - это (поскольку вы уже подклассифицируете UITableViewCell) создать свойство UIProgressView в подклассе UITableViewCell, добавить его в ячейку в методе initWithStyle, а затем изменить его расположение в layoutSubviews.

1 голос
/ 23 марта 2012

Метод drawRect переопределяется для выполнения пользовательского рисования в виде.Вы не должны переопределять этот метод, если не выполняете пользовательское рисование, потому что это ухудшает производительность.

Чтобы отобразить изображение, используйте UIImageView.Чтобы отобразить UIProgressView, добавьте его как подпредставление, например:

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