2014-03-15 3 views
0

У меня есть UITableView с картами в нем. Если карта воспроизводится, цвет фона зеленый, если нет, цвет фона красный. Я хочу, чтобы это было анимированный в пульсирующем пути, и я уже успел сделать так:Анимация UITableViewCell backgroundcolor

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 


Card *card; 
card = [[game playerCards] objectAtIndex:indexPath.row]; 

if(card.playable == IsPlayable){ 
[UIView animateKeyframesWithDuration:0.9 delay:0.0 options:UIViewAnimationOptionRepeat |  UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction animations:^{ 
     cell.backgroundColor = [UIColor colorWithRed:0.105882F green:0.564706F blue:0.243137F alpha:1.0F]; 
     cell.backgroundColor = [UIColor colorWithRed:0.105882F green:0.564706F blue:0.243137F alpha:0.0F]; 
           completion:^(BOOL finished) {   
           }];} 
else if (card.playable == IsNotPlayable){ 
[UIView animateKeyframesWithDuration:0.9 delay:0.0 options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction animations:^{ 
     cell.backgroundColor = [UIColor colorWithRed:1.000000F green:0.000000F blue:0.090196F alpha:1.0F]; 
     cell.backgroundColor = [UIColor colorWithRed:1.000000F green:0.000000F blue:0.090196F alpha:0.0F]; 
           completion:^(BOOL finished) { 
           }];} 
} 

Это работает очень хорошо, но, анимация не синхронизированы после прокрутки. Поэтому, когда viewdidload закончен, все видимые ячейки пульсируют синхронно, но после прокрутки таблицы анимация больше не синхронизируется, что дает уродливый эффект.

Мне удалось преодолеть это, вызвав [playerCardsTable reloadData] в scrollViewDidScroll. Теперь, когда я просматриваю таблицу, анимация останавливается и дает ей правильный цвет в полной альфе, и когда прокрутка остановлена, она снова начинает пульсировать синхронно. Это именно то, что я хочу! Но это кажется очень «дорогим способом». При прокрутке процессор достигает 12% (индикатор ЦП в Xcode). Я также попытался запустить анимацию с помощью таймера, но безрезультатно.

Должен ли я продолжать повторную загрузку данных таблицы во время прокрутки? Или есть другой способ? И побочный вопрос, составляет 12% (Mac Mini i7)?

Спасибо!

+0

Вы не должны повторно отправить свой вопрос, вместо этого вы должны редактировать старые один. http://stackoverflow.com/questions/22373185/sync-animation-background-color-uitableviewcell – vikingosegundo

+0

Мой плохой, удаленный старый. – Niels

+0

@ Нильс, мне просто интересно, почему бы не поставить свой код в cellForRow? – John

ответ

0

Это мое предложение

Добавьте это 2 свойства к вашему контроллеру. Эти свойства будут управлять% альфа

@property CGFloat alpha; 
@property CGFloat alphaInc; //alpha will be incremented/decremented by this value 

В вашем viewDidLoad, инициализации свойств и создать таймер для обновления фона

self.alphaInc = 0.01; 
self.alpha = 0.1; 

[NSTimer scheduledTimerWithTimeInterval:0.05 
           target:self 
           selector:@selector(updateMyCells) 
           userInfo:nil 
           repeats:YES]; 

добавить метод, который будет обновлять клетки. Я принял во внимание, что вы используете UITableViewController, иначе создайте iBoutlet для представления Table и назовите его tableview.

-(void)updateMyCells { 
    self.alpha += self.alphaInc; 
    if (self.alpha > .5 || self.alpha < .1) { 
     self.alphaInc *= -1; 
     self.alpha += self.alphaInc; 
    } 

    [[self.tableView visibleCells] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     if (obj) { 
      UITableViewCell *cell = (UITableViewCell*)obj; 
      cell.backgroundColor = [cell.backgroundColor colorWithAlphaComponent:self.alpha]; 
     } 
    }]; 
} 

и, наконец, настроить Tableview: willDisplayCell: forRowAtIndexPath::

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 

    Card *card; 
    card = [[game playerCards] objectAtIndex:indexPath.row]; 

    if(card.playable == IsPlayable){ 
     cell.backgroundColor = [UIColor colorWithRed:0.105882F green:0.564706F blue:0.243137F alpha:1.0F]; 
    else { 
     cell.backgroundColor = [UIColor colorWithRed:1.000000F green:0.000000F blue:0.090196F alpha:1.0F]; 
    } 
} 
+0

Это действительно хорошая альтернатива. Большое спасибо! – Niels

0

К сожалению, ячейки загружаются при прокрутке, а не при создании вида таблицы. Поэтому, если вы прокрутите половину экрана, новые ячейки будут не синхронизированы с уже показанными. Вы можете каждый раз перезагружать данные таблицы, но это несколько уродливое решение. Вместо этого вы можете попробовать создать собственный просмотр таблицы с помощью scrollview. В этом случае вы можете сразу загрузить все подзоны (ячейки таблицы) и синхронизировать их пульсирование.

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

+0

Ваше второе решение - хорошее. – mahboudz

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