我有一张带卡片的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)?
谢谢!
答案 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];
}
}