Просмотр UIProgress в приложении для записи

#iphone #avaudiorecorder #uiprogressview

#iPhone #avaudiorecorder #uiprogressview

Вопрос:

Я добавляю uiprogreesView в приложение для записи.Когда я нажимаю кнопку «Начать запись», для начала записи потребуется несколько секунд, и начнется просмотр хода выполнения, я также настроил uilabels, чтобы получить записанное время.Но мой просмотр прогресса не синхронизирован со временем записи.Фактическое время записи меньше, чем метка просмотра хода выполнения.. Вот мой код

 - (IBAction)startRecordingButtonPressed:(id)sender {


recorder = [[AVAudioRecorder alloc]initWithURL:recordedFile
                                              settings:recordSetting error:amp;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];

    }

}
  

пожалуйста, помогите.И когда я нажимаю кнопку записи, кнопка становится синей на несколько секунд, а затем возвращается к цвету по умолчанию, затем начинается фактическая запись, но при нажатии кнопки запускается просмотр хода выполнения.

Ответ №1:

Вы можете использовать включить NSTimer на заданный интервал и в дополнение использовать CADisplayLink, который позволит вам обновлять ваш дисплей в соответствии с ходом времени (вы можете получить дату запуска из NSTimer в любой заданный момент и обновлять индикатор выполнения в соответствии с этим).

Когда срабатывает 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. Я не использовал CADisplayLink. у вас есть какой-нибудь пример или ссылка? кроме того, что вы предложили в ответе?

2. Вы можете попробовать это . Большинство применений связаны с OpenGL, но он отлично подходит и для более простых графических запросов.

Ответ №2:

Предполагая, что прогресс должен каким-то образом отображать прошедшее время, разве вы не можете использовать 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: .

Комментарии:

1. но это не объясняет синий цвет. Возможно, это не настоящее решение вашей проблемы.

2. Синий цвет означает.. Для начала записи требуется время.

3. О, хорошо. Я думал, это какой-то сбой пользовательского интерфейса, с которым вы столкнулись. Итак, это сработало?

4. привет, время просмотра прогресса все еще не синхронизируется с записью, я использовал ваш код .. Я думаю, это происходит потому, что моя кнопка записи зависла на несколько секунд. что я должен делать?

5. Обновите код в проблеме. Трудно сказать вот так. Зависает ли весь просмотр или только кнопка записи?