我正在尝试为一个作业编写一个音乐播放器代码,而我仍然坚持尝试在播放歌曲时让滑块更新。我已经能够做到这一点,如果用户滑动滑块,歌曲将快退/快进到歌曲的那一部分。有谁知道为什么滑块不会随着歌曲的播放而不断更新?
这是.h文件
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
@interface AS3MPViewController : UIViewController <MPMediaPickerControllerDelegate>{
IBOutlet UIButton *playButton;
IBOutlet UIButton *stopButton;
IBOutlet UIButton *pauseButton;
IBOutlet UISlider *volumeSlider;
AVAudioPlayer *musicPlayer;
IBOutlet UIButton *pickSongButton;
IBOutlet UISlider *timeSlider;
NSTimer *timer;
}
@property (nonatomic, retain) UIButton *playButton;
@property (nonatomic, retain) UIButton *stopButton;
@property (nonatomic, retain) UIButton *pauseButton;
@property (nonatomic, retain) UISlider *volumeSlider;
@property (nonatomic, retain) AVAudioPlayer *musicPlayer;
@property (nonatomic, retain) UIButton *pickSongButton;
@property (nonatomic, retain) UISlider *timeSlider;
@property (nonatomic, retain) NSTimer *timer;
- (IBAction) play;
- (IBAction) stop;
- (IBAction) pause;
- (IBAction) changeVolume: (UISlider *)sender;
- (IBAction) chooseSong: (UIButton *)sender;
- (IBAction) changeTime: (UISlider *)sender;
- (void)setTimeSliderOptions;
@end
这是.m文件
#import "AS3MPViewController.h"
@interface AS3MPViewController ()
@end
@implementation AS3MPViewController
@synthesize playButton = _playButton;
@synthesize stopButton = _stopButton;
@synthesize pauseButton = _pauseButton;
@synthesize musicPlayer = _musicPlayer;
@synthesize volumeSlider = _volumeSlider;
@synthesize pickSongButton = _pickSongButton;
@synthesize timeSlider = _timeSlider;
@synthesize timer;
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"animals001" ofType:@"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];
self.musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[self.musicPlayer prepareToPlay];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction) play {
[self.musicPlayer play];
}
- (IBAction) stop {
[self.musicPlayer stop];
self.musicPlayer.currentTime = 0;
}
- (IBAction) pause {
[self.musicPlayer pause];
}
- (IBAction) changeVolume: (UISlider *)sender {
self.musicPlayer.volume = [sender value];
}
- (IBAction)chooseSong:(UIButton *)sender {
MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAnyAudio];
[mediaPicker setDelegate:self];
[mediaPicker setAllowsPickingMultipleItems:NO];
mediaPicker.prompt = NSLocalizedString(@"Add Some Songs To Play", "Prompt In Media Item Picker");
[self presentModalViewController: mediaPicker animated:YES];
}
- (void) mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker {
[self dismissModalViewControllerAnimated:YES];
}
- (void) mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems: (MPMediaItemCollection *)mediaItemCollection {
MPMediaItem *item = [[mediaItemCollection items] objectAtIndex:0];
NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
//AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
//AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
self.timeSlider.maximumValue = [self.musicPlayer duration];
self.musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[self.musicPlayer play];
timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(songCurrentTime) userInfo:nil repeats:YES];
[self dismissModalViewControllerAnimated:YES];
}
- (IBAction)changeTime: (UISlider *)sender {
self.musicPlayer.currentTime = self.musicPlayer.duration * sender.value;
}
- (void)songCurrentTime {
timeSlider.value = (self.musicPlayer.currentTime / self.musicPlayer.duration);
}
@end
答案 0 :(得分:2)
使用带ValueChanged的滑块检查连接IBAction方法的连接 EX:
- (IBAction)changeTime: (UISlider *)sender {
检查此方法是否与IB连接时的ValueChanged连接
答案 1 :(得分:1)
我认为您的问题是您正在从主要线程以外的线程更新滑块的值。尝试修改songCurrentTime方法,以便在主线程上调用另一个更新滑块值的方法。
- (void)songCurrentTime {
[self performSelectorOnMainThread:@selector(songCurrentTimeMain) withObject:nil waitUntilDone:YES];
}
- (void)songCurrentTimeMain {
timeSlider.value = (self.musicPlayer.currentTime / self.musicPlayer.duration);
}
当然要获得正确的结果,请确保滑块的最小值为0,最大值为1.
最好的问候
答案 2 :(得分:0)
设置滑块值时,该值始终小于或等于1,因为self.musicPlayer.currentTime
始终小于或等于self.musicPlayer.duration
。相反,试试这个
timeSlider.value = self.musicPlayer.currentTime;
答案 3 :(得分:0)
我在this教程中做了类似的事情,我添加滑块的方式和你做的一样,除了我使用的事实
<强> musicPlayer.currentPlaybackTime 强>
作为分配给滑块的值。
可能是(self.musicPlayer.currentTime / self.musicPlayer.duration)的结果是对滑块值的不准确分配。
答案 4 :(得分:0)
timeSlider
和self.timeSlider
不是一回事。您声明的大多数iVar都是不必要的(并且具有误导性),因为您使用属性名称的下划线形式合成属性。例如,您有一个由timeSlider
iVar支持的_timeSlider
属性,以及一个完全不同的timeSlider
iVar。
使用self.timeSlider.value = ...
。
答案 5 :(得分:0)
对我来说,问题不同,我需要为滑块设置初始值,但这是一个愚蠢的错误,因为我在设置最大值和最小值之前先更新滑块值。
错误的代码:
float value = [self getSliderDefaultValue];
[slider setValue:value animated:NO];
slider.maximumValue = numberOfSteps;
slider.minimumValue = 0;
工作代码:
slider.maximumValue = numberOfSteps;
slider.minimumValue = 0;
float value = [self getSliderDefaultValue];
[slider setValue:value animated:NO];
希望它会对其他人有帮助!
答案 6 :(得分:0)
在我的情况下,我的UISlider上有透明的视图,我一直在俯视它。