我正在实施UISlider,它运行正常。
CGFloat y = self.view.frame.size.width - (self.view.frame.size.height-20) + 350;
self.currentTimeSlider = [[UISlider alloc] initWithFrame:CGRectMake(self.view.frame.size.width-285,y,self.view.frame.size.width-120,self.view.frame.size.height-20)];
self.currentTimeSlider.minimumValue=0;
self.currentTimeSlider.maximumValue = self.audioPlayer.getAudioDuration;
[self.currentTimeSlider addTarget:self
action:@selector(sliderChanged:)
forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
self.currentTimeSlider setBackgroundColor:[UIColor clearColor]];
self.currentTimeSlider.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin;
- (void)updateTime:(NSTimer *)timer {
NSLog(@"slider = %f",self.currentTimeSlider.value);
textView.hidden=NO;
NSString *bgFilePath = [[NSBundle mainBundle] pathForResource:@"inside"
ofType:@"png"];
bgimg = [[UIImage alloc] initWithContentsOfFile:bgFilePath];
[bgImageView setImage:bgimg];
if([self.audioPlayer getCurrentAudioTime]==0)
{
NSLog(@"song finished.");
NSString *bgFilePath = [[NSBundle mainBundle] pathForResource:@"screen5"
ofType:@"jpg"];
bgimg = [[UIImage alloc] initWithContentsOfFile:bgFilePath];
[bgImageView setImage:bgimg];
textView.hidden=YES;
}
long currentPlaybackTime = [self.audioPlayer getCurrentAudioTime];
if ((currentPlaybackTime / [self.audioPlayer getAudioDuration]) > self.currentTimeSlider.value )
{
self.currentTimeSlider.value = currentPlaybackTime / [self.audioPlayer getAudioDuration];
self.timeElapsed.text = [NSString stringWithFormat:@"%@",
[self.audioPlayer timeFormat:[self.audioPlayer getCurrentAudioTime]]];
self.duration.text = [NSString stringWithFormat:@"%@",
[self.audioPlayer timeFormat:[self.audioPlayer getAudioDuration] - [self.audioPlayer getCurrentAudioTime]]];
}
else
{
self.timeElapsed.text = [NSString stringWithFormat:@"%@",
[self.audioPlayer timeFormat:[self.audioPlayer getCurrentAudioTime]]];
NSLog(@"time elapsed = %d",self.timeElapsed.text);
self.duration.text = [NSString stringWithFormat:@"%@",
[self.audioPlayer timeFormat:[self.audioPlayer getAudioDuration] - [self.audioPlayer getCurrentAudioTime]]];
}
}
- (IBAction)sliderChanged:(id)currentTimeSlider
{
NSLog(@"sliderValue = %f",self.currentTimeSlider.value);
NSLog(@"sliderValuesss = %f",self.currentTimeSlider.value);
[self.audioPlayer setCurrentAudioTime:self.currentTimeSlider.value];
[NSTimer scheduledTimerWithTimeInterval:0.02
target:self
selector:@selector(updateTime:)
userInfo:nil
repeats:NO];
}
我的问题是滑块拇指不会自行拖动。但是在手动滑块上拖动定时器更新以及歌曲。但是如果我评论最小值和最大值,那么滑块会自行拖动,但是手动幻灯片从头开始播放歌曲。
self.currentTimeSlider.minimumValue=0;
self.currentTimeSlider.maximumValue = self.audioPlayer.getAudioDuration;
请知道如何实现手动和自动滑块拖动。
谢谢,
答案 0 :(得分:1)
您正在使用 NSTimer
,它运行在一个单独的线程上,而不是在主线程上,UI由主线程处理。
因此,要解决您的问题,您需要在主线程上触发事件以使用此方法更新UI: performSelectorOnMainThread:withObject:waitUntilDone:NO
在该选择器方法中编写代码以更新自定义滑块值。
还有一个建议,每次都不要创建自定义滑块,你可以在viewDidLoad时创建它,现在它在updateTime
中,它会引起内存问题。而不是在此方法中仅将滑块值更改为更新的滑块值。