2012-03-22 3 views
0

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

Я переопределение метода DrawRect,

так что я должен создать UIProgressView внутри DrawRect?


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

Вот мой UITableViewCell подкласс другого класса (только для демонстрации, как я сделал подклассов 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; 

}

вот как я использую его в - (ничтожной) 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 в качестве источника данных, поэтому, когда я просматриваю табличное представление, нет доступа к основным данным (но все же laggy). Пожалуйста, если у вас есть какие-либо предложения, я бы хотел услышать, и я люблю этот способ больше, чем подкласс UIView, а затем переопределить drawRect.

благодаря

ответ

1

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

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

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

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

+0

Я пробовал ваше решение, но оно не работает или я не понимаю его полностью. Я создаю свойство UIProgressView в моем подклассе UITableViewCell, а затем инициализирую progressView и добавляю его в ячейку: [self.contentView addSubview: progressView], также устанавливаю progressView hidden = YES по умолчанию, а затем в cellForRowAtIndexPath, на основе некоторого условия , я устанавливаю cell.progressView.hidden = NO и передаю ему значение прогресса: cell.progressView.progress = progressValue, но когда я перезагружаю приложение, я не вижу никакого progressView. не могли бы вы предоставить мне более подробную информацию? спасибо – triston

+0

Вы не забыли инициализировать представление прогресса и установить соответствующий кадр? –

+0

Вы правы, это мое плохое, я получил фрейм неправильно (копирование и вставка). теперь я понял это правильно. Я добавил uiprogressview в UITableViewCell как подвью. поэтому теперь я получил два подзаголовка в подклассе UITableViewCell. 1.UIProgressView, 2. UIView (содержит все остальные материалы на основе NSString). Есть еще небольшая проблема. Допустим, что уже есть 10 ячеек, когда я выполняю фоновый режим, в последнюю ячейку добавляется новый progressView, и я просматриваю представление таблицы вниз, затем вижу, что я вижу еще один точно такой же progressView, который работает в первой ячейке. Есть идеи? – triston

1

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

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

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

Я использовал для добавления subview в ячейку таблицы, но когда у меня больше 20-30 строк, прокрутка становится лагги, поэтому я переигрываю drawRect, и теперь она прокручивается очень гладко. но я застрял в добавлении UIProgressView. – triston

+1

Правильно ли вы использовали 'reuseIdentifier'' UITableView'? Я не думаю, что использование subviews в ячейке должно каким-либо образом приводить к тому, что прокрутка становится ломающейся, если что-то не так. Можете ли вы показать код? – Krumelur

+0

извините, я бы хотел поделиться кодом, если у меня все еще есть, я уже удалил старый код и переключился на подкласс UIView. – triston

Смежные вопросы