录制应用程序中的UIProgress视图

时间:2011-05-23 08:08:06

标签: iphone avaudiorecorder uiprogressview

我在录制应用程序中添加了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];

    }

}

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

2 个答案:

答案 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:中重新启动它。