2016-06-04 19 views
0

Die App ist ein Musik-Player, und ich muss eine trackTimeLabel zeigen, die die Wiedergabedauer während des Songs aktualisiert.Update Song Zeitlabel

Aktualisieren Sie das Label also jede Sekunde mit der Wiedergabespurdauer.

Im Moment mache ich einen Hack, wo ich nur Sekunden zählte, die nichts mit dem Lied zu tun hat, aber das ist keine gute Lösung:

- (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 hat eine MPMediaItem Klasse, die ich kann, Holen Sie sich eine MPMediaItemPropertyPlaybackDuration für den Track, aber ich kann nicht scheinen, etwas damit zu arbeiten.

+0

Sie versuchen, eine tatsächliche Echtzeit-Lesung zu erhalten, wie viel Zeit entweder bleibt oder während einer Track-Wiedergabe verstrichen ist? –

+0

@CraigSmith genau, sorry, wenn ich das nicht gut genug erklärt habe, aber du hast es verstanden. Irgendwelche Ideen? – SRMR

Antwort

1

Schritt 1

In Ihrem 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; 

Schritt 2

In Ihrem 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]; 


} 

Das ist perfekt w orking code for me ... Versuchen Sie dies, ich hoffe, dies wird Ihnen helfen :)

+0

Danke! Ich bekomme 0:00 als die Zeit, egal was dabei ist. Außerdem rufe ich das nur mit 'NSTimer * timer = [NSTimer timerWithTimeInterval: 1.0 an: self selector: @selector (updateTime :) userInfo: nil wiederholt: YES]; oder mache ich etwas anderes damit? – SRMR

+0

bist du nicht dein Problem zu lösen ?? ... wenn nicht, was ist der Fehler jetzt ?? –

+0

Ich bekomme 0:00 als Zeit, egal, an welchem ​​Punkt der Song ist. Und woher soll ich diese Methoden nennen? – SRMR