0

我在录制应用程序中添加 uiprogreesView。当我点击开始录制按钮时,开始录制需要几秒钟,我的进度视图开始,我还管理 uilabels 来获取录制的时间。但是我的进度视图与录制时间不同步。实际录制时间少于进度视图标签..这是我的代码

- (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];

    }

}

请帮助。当我点击录制按钮时,按钮将变为蓝色几秒钟,然后我回到其默认颜色,然后开始实际录制,但在点击按钮时开始进度视图。

4

2 回答 2

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 时。

于 2011-05-23T09:25:09.657 回答
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:

于 2011-05-23T09:48:24.140 回答