我正在制作基本的音乐流光。在视图控制器(PlayerViewController)中,我有一个带有自定义UITableViewCell(称为MediaItemTableViewCell)的UITableView。在函数cellForRowAtIndexPath中,我添加关于当前流式音乐曲目的元数据,并在单元格是当前播放歌曲时添加动画。这一切都正常,并添加了动画。
问题是如果用户完全滚动UITableView,那么动画就会消失。我已经跟踪了我编写的代码并使用了断点和NSLog来验证我的变量在每一步都是正确的。滚动后,如果我一直将动画设置为每个单元格,动画甚至会消失(例如,在if块之外设置动画)。
我的代码中有什么问题,或者我没有看到iOS中发生的事情吗?
MediaItemTableViewCell:
@interface MediaItemTableViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *track_title;
@property (weak, nonatomic) IBOutlet UILabel *artist;
@property (weak, nonatomic) IBOutlet UILabel *duration;
@property (weak, nonatomic) IBOutlet UIImageView *sc_album_image;
@property (weak, nonatomic) IBOutlet UIImageView *playing_animation;
@end
我的PlayerViewController的cellForRowAtIndexPath:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MediaItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
MediaItem *track = [self.playlist objectAtIndex:indexPath.row];
_playListTableView.backgroundColor = [UIColor clearColor];
cell.backgroundColor = [UIColor clearColor];
cell.contentView.backgroundColor = [UIColor clearColor];
cell.backgroundColor = [UIColor clearColor];
cell.backgroundView = [[UIView alloc] initWithFrame:CGRectZero];
cell.track_title.text = track.track_title;
cell.artist.text = track.artist;
cell.duration.text = track.duration;
cell.sc_album_image.image = track.artwork;
cell.backgroundColor = [UIColor clearColor];
if((int)_current_track_index == (int)indexPath.row && _player.isPlaying)
{
cell.playing_animation.image = [UIImage animatedImageNamed:@"wave" duration:0.6f];
}
return cell;
}
答案 0 :(得分:1)
您正在play_animation UIImageView上设置静态图像。
你的动画帧是基于吗?
也许你需要设置UIImageView的animationImages属性。它是一个NSArray图像,您可以使用属性animationDuration和animationRepeatCount配置持续时间和重复次数。
喜欢:
if((int)_current_track_index == (int)indexPath.row && _player.isPlaying) {
NSMutableArray *images = [[NSMutableArray alloc] init];
for (int i = 0; i < MAX_NUMBER_IF_IMAGES_IN_ANIMATION; ++i) {
[images addObject:[UIImage imageNamed:[NSString stringWithFormat:"wave%d", i+1]];
}
cell.playing_animation.animationImages = images;
cell.playing_animation.animationDuration = 0.6;
[cell.playing_animation startAnimating];
}
答案 1 :(得分:1)
我通过重新制作动画的创建方式来解决这个问题。如果在cellForRowAtIndexPath中的块与之前一样,但使用我更新的代码,则以下内容相同。虽然需要重构,但这个初始版本仍有效:
if((int)_current_track_index == (int)indexPath.row && _player.isPlaying)
{
cell.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.2];
cell.song_index_label.text = @"";
NSArray *imageNames = @[@"wave1.png", @"wave2.png", @"wave3.png", @"wave4.png", @"wave5.png", @"wave6.png", @"wave7.png"];
NSMutableArray *images = [[NSMutableArray alloc] init];
for (int i = 0; i < imageNames.count; i++) {
[images addObject:[UIImage imageNamed:[imageNames objectAtIndex:i]]];
}
// Normal Animation
cell.playing_animation.animationImages = images;
cell.playing_animation.animationDuration = 0.6;
[cell.playing_animation startAnimating];
}
缺点是每次表格滚动得足够远时动画会重新启动并且看起来很笨重。将不得不重构并提出更好的东西。仍然不确定为什么我的原始尝试不起作用,因为它们都应该是向细胞添加动画的有效方法。我喜欢原始代码,因为它在功能方面非常简洁,但它更简洁。