Основываясь на комментариях и тестах, вот что я сейчас делаю:
Когда я получаю изображение из UIImageController
, я сохраняю его в классе ivar и отключаю средство выбора изображений. Я показываю представление, которое блокирует мой основной вид, и планирую событие NSTimer, чтобы выполнить сжатие за секунду, а затем возвращаюсь к вызывающей стороне.
Это позволяет запустить анимацию, которая отключает контроллер изображения. Мой блокатор открывается под ним.
(Представление блокировщика заполняет всю область содержимого контроллера навигации и отображается сплошным черным цветом с UIActivityIndicatorView
.)
- (void)imagePickerController: (UIImagePickerController *)picker
didFinishPickingImage: (UIImage *)selectedImage
editingInfo: (NSDictionary *)editingInfo;
{
busyView.userInteractionEnabled = YES;
busyView.alpha = 0.7f;
mainView.userInteractionEnabled = NO;
[self dismissModalViewControllerAnimated: YES];
[NSTimer scheduledTimerWithTimeInterval: 1.0f
target: self
selector: @selector(compress:)
userInfo: selectedImage
repeats: NO];
}
Когда срабатывает таймер, я сжимаю изображение в формате JPEG (потому что он быстрее, чем PNG, несмотря на интуицию) и исчезаю из вида блокировщика.
- (void)compress: (NSTimer *)inTimer;
{
[self gotJPEG: UIImageJPEGRepresentation( inTimer.userInfo, 0.5f )];
[UIView beginAnimations: @"PostCompressFade" context: nil];
[UIView setAnimationDuration: 0.5];
busyView.userInteractionEnabled = NO;
busyView.alpha = 0.0f;
[UIView commitAnimations];
mainView.userInteractionEnabled = YES;
}
Несмотря на то, что это добавляет секунду для обработки, оно убирает средство выбора изображений, поэтому мое приложение больше не чувствует себя замороженным. Анимация из UIActivityIndicatorView
работает, пока работает UIImageJPEGRepresentation
.
Лучшим ответом, чем использование NSTimer
с задержкой в 1 секунду, было бы получение события после завершения анимации из dismissModalViewControllerAnimated:
, но я не уверен, как это сделать.
(я пока не считаю это решенным.)