动画UITableViewCell backgroundcolor

时间:2014-03-15 15:16:04

标签: ios uitableview

我有一张带卡片的UITableView。如果卡是可播放的,则背景颜色为绿色,否则背景颜色为红色。我想让它以一种脉动的方式动画,我已经设法这样做了:

-(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完成时,所有可见单元格都在同步脉动,但在滚动表格之后,动画不再同步,这会产生难看的效果。

我设法通过在scrollViewDidScroll中调用[playerCardsTable reloadData]来克服这个问题。现在,当我滚动表格时,动画停止并以完整的alpha值给出正确的颜色,当滚动停止时,它会再次开始同步脉动。这正是我想要的!但这似乎是一种非常昂贵的方式"。滚动期间CPU的峰值为12%(Xcode中的CPU指示灯)。我也试过用Timer启动动画,但无济于事。

我应该继续在滚动期间重新加载表格数据吗?或者还有另一种方式吗?一个附带问题,很多是12%(Mac Mini i7)?

谢谢!

2 个答案:

答案 0 :(得分:0)

不幸的是,滚动时会加载单元格,而不是在创建表格视图时加载。因此,如果向下滚动半个屏幕,新单元格将与已显示的单元格不同步。您可以每次重新加载表数据,但这是一个有点难看的解决方案。您可以尝试使用scrollview来创建自己的tableview。在这种情况下,您可以一次加载所有子视图(表格单元格)并让它们同步脉动。

此外,您可以制作一些计时器或触发通知,让通知触发每个可见单元格中的脉动。这样,每个新的脉动都会被通知触发。

答案 1 :(得分:0)

这是我的建议

将此2个属性添加到控制器。此属性将管理alpha的百分比

@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,否则请为您的Table视图创建一个iBoutlet并将其命名为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];
    }
}