动画 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背景色.选中背景色,分割线,字体颜色设置