#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. Обновите код в проблеме. Трудно сказать вот так. Зависает ли весь просмотр или только кнопка записи?