用户滚动UITableView后,UITableViewCell动画消失

时间:2015-05-18 19:31:38

标签: ios uitableview

我正在制作基本的音乐流光。在视图控制器(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;

    }

2 个答案:

答案 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];
}

缺点是每次表格滚动得足够远时动画会重新启动并且看起来很笨重。将不得不重构并提出更好的东西。仍然不确定为什么我的原始尝试不起作用,因为它们都应该是向细胞添加动画的有效方法。我喜欢原始代码,因为它在功能方面非常简洁,但它更简洁。