Обнаружение поворота устройства при представлении UIImagePicker

Я использую класс UIImagePickerController, и мои кнопки находятся в оверлее камеры.

Я хотел бы динамически регулировать ориентацию кнопок моей камеры в зависимости от ориентации устройства, как это делает Apple Camera.app. Я понимаю, что UIImagePickerController предназначен только для портретного режима и не должен быть подклассом. Тем не менее, я хотел бы иметь возможность перехватывать и реагировать на события viewController вращения устройства.

Есть ли чистый способ сделать это? ViewController, который представляет UIImagePickerController, больше не отвечает на события после представления средства выбора.

Кажется, есть несколько связанных вопросов по этому тема, но ни одна из них не разъясняет, возможно ли то, что я хочу сделать, или нет. Неразбериху усугубляет то, что, похоже, есть некоторые различия в функциональности UIImagePickerController между версиями iOS. Я разрабатываю это на iOS6/iPhone4, но хотел бы быть совместимым с iOS5.


person spring    schedule 03.02.2013    source источник


Ответы (1)


Вот простой способ сделать это, проверенный на iPhone4s/iOS5.1 и iPhone3G/iOS6.1.

Я использую образец Apple PhotoPicker и делаю пару небольших изменений. Я ожидаю, что вы сможете адаптировать этот подход для своего проекта. Основная идея состоит в том, чтобы использовать уведомления для запуска метода каждый раз, когда мы вращаемся. Если этот метод находится в контроллере представления наложения, он может продолжать манипулировать наложением во время отображения imagePicker.

В OverlayViewController.m добавьте это в initWithNibName

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self
                           selector:@selector(didChangeOrientation)
                               name:@"UIDeviceOrientationDidChangeNotification"
                             object:nil];

Эти уведомления продолжают отправляться, пока отображается pickerController. Итак, здесь, в контроллере представления оверлея, вы можете продолжить играть с интерфейсом, например:

- (void) didChangeOrientation
{
    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {
        self.cancelButton.image =[UIImage imageNamed:@"portait_image.png"];
    } else {
        self.cancelButton.image =[UIImage imageNamed:@"landscape_image.png"];
    }
}

вам нужно будет убить уведомление и удалить наблюдателя в viewDidUnload:

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self];

Обратите внимание на то, как разработано это приложение: overlayViewController действует как оболочка вокруг imagePickerController. Итак, вы вызываете imagePicker через overlayViewController:

    [self presentModalViewController:self.overlayViewController.imagePickerController animated:YES];

OverlayViewController выступает в качестве делегата для imagePickerController и, в свою очередь, имеет методы делегата для передачи информации обратно вызывающему контроллеру представления.

В качестве альтернативы можно вообще не использовать UIImagePickerController, а использовать Захват мультимедиа AVFoundation, что дает вам гораздо более детальный контроль над процессом создания изображений за счет (немного) большей сложности .

person foundry    schedule 15.02.2013