2015-05-18 100 views
1

我正在製作基本的音樂流。在視圖控制器(PlayerViewController)中,我有一個帶有自定義UITableViewCell的UITableView(稱爲MediaItemTableViewCell)。在函數cellForRowAtIndexPath中,添加有關當前流式音樂曲目的元數據,並在單元格是當前正在播放的歌曲時添加動畫。這一切正常工作,並添加動畫。用戶滾動UITableView後UITableViewCell動畫消失

問題是,如果用戶滾動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

是否執行了if語句?你能在那裏放一個斷點嗎? – atreat

+0

依靠數據而不是indexPath,它可能會改變,最好是在自定義類中添加一個屬性,該屬性將包含MediaItem,並觸發您的動畫邏輯。 – iphonic

+0

在哪裏/如何設置_current_track_index? – rmp

回答

1

要設置在playing_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]; 
} 
+0

我的動畫是基於幀的。 5個不同的圖像都以「wave」開頭,我使用的命令會正確顯示和動畫,除非在用戶滾動tableview後動畫消失。無論我如何將動畫添加到單元格中,用戶滾動表格後動畫消失 – DavidH

+0

您是否嘗試過創建UIImage數組並將此數組設置爲UIImageView的animationImages屬性? – Wallace

+0

也許這可能有所幫助: http://stackoverflow.com/questions/2281597/uiimageview-animation-stopping-in-uitableview – Wallace

1

我通過我的返工動畫是如何創建的解決了這個。如果像以前一樣在blockForRowAtIndexPath中阻止,但使用我的更新代碼,則以下內容相同。重需要的重構的,這個初始版本的作品,但:

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

缺點是每一個表滾動足夠遠的動畫將重新啓動,並期待笨重的時間。將不得不重構並提出更好的東西。仍然不確定爲什麼我的原始嘗試不起作用,因爲它們都應該是向單元格添加動畫的有效方法。我喜歡原始代碼,因爲它更加簡潔,雖然它在功能方面非常破碎。

+0

仍然不確定爲什麼這個方法可以取代「animatedImageNamed」,但這也解決了我的問題。 – Miro