我在录制应用程序中添加了uiprogreesView。当我点击开始录制按钮时开始录制并开始我的进度视图需要几秒钟,我也用uilabels来记录时间。但我的progess视图与录制不同步time.Actual录制时间少于进度视图标签..这是我的代码
- (IBAction)startRecordingButtonPressed:(id)sender {
recorder = [[AVAudioRecorder alloc]initWithURL:recordedFile
settings:recordSetting error:&error];
[recorder setDelegate:self];
[recorder prepareToRecord];
[recorder recordForDuration:(NSTimeInterval)60];
[recorder record];
timeStartLabel.text != "0";
progressView.progress = 0.0;
[NSThread detachNewThreadSelector:@selector(startjob)
toTarget:self withObject:nil];
}
- (void )startjob {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
[NSThread sleepForTimeInterval:2];
[self performSelectorOnMainThread:@selector(moreProgress)
withObject:nil waitUntilDone:NO];
[pool release];
}
- (void)moreProgress {
float actual = [progressView progress];
timeStartLabel.text = [NSString stringWithFormat:@"%.2f" ,actual];
if (actual < 1) {
progressView.progress = actual + 0.01;
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(moreProgress)
userInfo:nil repeats:NO];
}
}
请帮助。当我点击录制按钮时,按钮将变为蓝色几秒钟然后我回到其默认颜色,然后实际录制开始但按钮点击时开始进度视图。
答案 0 :(得分:0)
您可以在给定的时间间隔内使用启用NSTimer,并使用CADisplayLink使您能够根据时间进度更新显示(您可以在任何给定点从NSTimer获取fireDate并更新根据那个进步吧。
当NSTimer触发时,您的显示链接无效(或者您可以将其暂停以备将来重播..)。
示例:
self.displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(drawView)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
然后在drawView方法中:
NSDate* currTS = [NSDate date];
NSDate* fireTS = [self.captureTimer fireDate];
NSTimeInterval tsInterval = [fireTS timeIntervalSinceDate:currTS];
float newProgress = 1.0f - (tsInterval / self.intervalFromDefault);
当self.captureTimer是您使用记录方法设置的NSTimer时。
答案 1 :(得分:0)
假设进度是以某种方式显示时间,您是否在更新中使用recorder.currentTime
?计时器保持不变,但标签和进度将根据此属性进行更新。
progressView.progress = recorder.currentTime / totalDuration;
timeStartLabel.text = [NSString stringWithFormat:@"%.2f", progressView.progress];
这样,progressView
在实际录制开始之前不会更新。
修改强>
- (void) moreProgress {
progressView.progress = recorder.currentTime / totalDuration; // Have totalDuration as ivar or replace it with '60' same as passed during recorder initialization.
timeStartLabel.text = [NSString stringWithFormat:@"%.2f", progressView.progress];
if ( recorder.recording ) {
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(moreProgress)
userInfo:nil repeats:NO];
}
}
如果暂停,则不会设置定时器。您可以拥有重复计时器并保存对它的引用,或者在委托方法audioRecorderEndInterruption:withFlags:
中重新启动它。