动画 UITableViewCell 背景色

Posted

技术标签:

【中文标题】动画 UITableViewCell 背景色【英文标题】:Animation UITableViewCell backgroundcolor 【发布时间】:2014-03-15 15:16:03 【问题描述】:

我有一个带有卡片的 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)?

谢谢!

【问题讨论】:

您不应该重新发布您的问题,而应该编辑较旧的问题。 ***.com/questions/22373185/… 我的错,删除了旧的。 @Niels,我只是想知道为什么不将您的代码放在 cellForRow 中? 【参考方案1】:

这是我的建议

将这 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,否则请为您的表格视图创建一个 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];
    

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于动画 UITableViewCell 背景色的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell背景色.选中背景色,分割线,字体颜色设置

uitableviewcell 背景色变为clearcolor

动画时透明UITableViewCell闪烁背景

WatchOS 背景色动画

查看背景色动画

巧妙地制作背景色渐变动画