2016-06-04 6 views
0

Приложение является музыкальным проигрывателем, и мне нужно показать trackTimeLabel, который обновляет продолжительность воспроизведения во время песни.Обновить метку времени песни

Итак, обновляйте этикетку каждую секунду с продолжительностью воспроизведения дорожки воспроизведения.

Прямо сейчас я делаю хак, где я просто подсчитывая секунды, которые не имеют ничего общего с песней, но это не является хорошим решением:

- (void)viewWillAppear:(BOOL)animated { 
    currentItem = [musicPlayer nowPlayingItem]; 
    _titleLabel.text = [self currentItemValue:MPMediaItemPropertyTitle]; 
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerDidTick:) userInfo:nil repeats:YES]; 
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
} 

-(void) timerDidTick:(NSTimer*) theTimer{ 
    long currentPlaybackTime = musicPlayer.currentPlaybackTime; 
    int currentHours = (int)(currentPlaybackTime/3600);       
    int currentMinutes = (int)((currentPlaybackTime/60) - currentHours*60);  // Whole minutes 
    int currentSeconds = (currentPlaybackTime % 60);       
    _trackTimeLabel.text = [NSString stringWithFormat:@"%i:%02d:%02d", currentHours, currentMinutes, currentSeconds]; 
} 

Apple, имеет MPMediaItem класс, который я могу получите MPMediaItemPropertyPlaybackDuration для трека, но я ничего не могу с этим поделать.

+0

Вы пытаетесь получить реальное чтение в реальном времени того, сколько времени осталось или осталось во время воспроизведения трека? –

+0

@CraigSmith yup точно, извините, если я не объяснил это достаточно хорошо, но вы его получили. Есть идеи? – SRMR

ответ

1

Шаг 1

В вашем ViewController.h

#import <AVFoundation/AVFoundation.h> 
#import <MediaPlayer/MediaPlayer.h> 

@interface ViewController : UIViewController 
{ 
    AVAudioPlayer * player; 
} 

@property (weak, nonatomic) IBOutlet UISlider *seekSlider; 

@property (weak, nonatomic) IBOutlet UILabel *lbl; 

Шаг 2

В вашем ViewController.m

- (void)viewDidLoad { 
    NSURL * fileURL = [[NSBundle mainBundle] URLForResource:@"01 - Saturday Saturday - DownloadMing.SE" withExtension:@"mp3"]; 

    NSError * error = nil; 

    player = [[AVAudioPlayer alloc]initWithContentsOfURL:fileURL error:&error]; 



    if(error) 
     NSLog(@"Error : %@ ", error); 

    [player prepareToPlay]; 

    player.volume = 0.5; 

    self.seekSlider.maximumValue = player.duration; 
} 
-(void)timerMethod:(NSTimer *)timer 
{ 


    float progress = player.currentTime; 
    // if(!self.seekSlider.isFocused) 
    self.seekSlider.value = progress; 

    _lbl.text = [NSString stringWithFormat:@"%.f:%.2d", (progress/60), ((int)progress % 60)]; 
} 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
- (IBAction)play_pause_clicked:(id)sender { 


    if(player.playing) 
    { 
     [player pause]; 
     [(UIButton*)sender setTitle:@"Play" forState:UIControlStateNormal]; 
    } 
    else 
    { 
     [player play]; 
     [(UIButton*)sender setTitle:@"Pause" forState:UIControlStateNormal]; 

     [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES]; 


    } 


} 


- (IBAction)seekPlayer:(id)sender { 

    player.currentTime = [(UISlider*)sender value]; 


} 
- (IBAction)changeVolume:(id)sender { 

    player.volume = [(UISlider*)sender value]; 


} 

Это идеальный вес orking code for me ... Попробуйте это, я надеюсь, это поможет вам :)

+0

Спасибо! Я получаю 0:00 как время, несмотря ни на что. Кроме того, я просто вызываю это с помощью 'NSTimer * timer = [NSTimer timerWithTimeInterval: 1.0 target: self selector: @selector (updateTime :) userInfo: nil repeatts: YES];' или я делаю что-то другое с ним? – SRMR

+0

Вы не решаете свою проблему? ... если нет, то какая ошибка сейчас? –

+0

Я получаю 0:00, как время, независимо от того, в какой точке песни находится. И откуда я должен называть эти методы? – SRMR