viewWillTransitionToSize для заблокированной ориентации

Есть ли способ определить ориентацию экрана, даже если пользователь заблокировал свою ориентацию? В моем приложении используется настраиваемый вид камеры, и я хотел бы иметь возможность сохранять изображения в альбомной или портретной ориентации в зависимости от ориентации. В настоящее время я использую следующий код для определения ориентации, однако это работает, только если пользователь не заблокировал его.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        let orientation: UIDeviceOrientation = UIDevice.current.orientation

        switch (orientation) {
        case .portrait:
            print("Portrait")
        case .landscapeRight:
            print("Left")
        case .landscapeLeft:
            print("Right")
        default:break
        }
    }

Если это неправильный способ работы с ориентацией камеры, пожалуйста, направьте меня в правильном направлении.


person Christopher Smit    schedule 19.07.2017    source источник
comment
У вас есть собственная камера, встроенная в контроллер представления? Если да, то я так понимаю, что теперь вы умеете сохранять изображения только в портретном режиме?   -  person kamil3    schedule 19.07.2017
comment
Да, я знаю, мне нужно было иметь возможность делать более одного изображения за раз и сохранять все изображения в свой профиль одновременно. Так что обычный сборщик изображений Apple у меня не работал. Все работает, за исключением того, что теперь все изображения в портретной ориентации. Нет ли абсолютно НИКАКОГО способа получить изображения в альбомной ориентации? Это кажется немного странным   -  person Christopher Smit    schedule 19.07.2017
comment
Это хак, но вы, вероятно, можете использовать акселерометр и/или гироскоп, чтобы узнать, когда устройство изменило свою ориентацию.   -  person Malik    schedule 19.07.2017
comment
@Малик, как мне это сделать?   -  person Christopher Smit    schedule 19.07.2017
comment
Вам придется немного почитать об обоих. Вот ссылка, чтобы объяснить основы этого nshipster.com/cmdevicemotion   -  person Malik    schedule 19.07.2017


Ответы (1)


Я считаю, что единственный способ сделать это — включить в проекте как портретный, так и ландшафтный режим: введите здесь описание изображения

Затем переопределите эти свойства во всех ваших контроллерах представления, которым не нужен ландшафтный режим.

override var shouldAutorotate: Bool {
    return false
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return .portrait
}

В контроллере представления со встроенной камерой просто установите shouldAutorotate false и добавьте дополнительные supportedInterfaceOrientations, которые используются в альбомной ориентации.

Обратите внимание, что если вы используете UINavigationController или UITabBarController, это не сработает, поэтому вам следует создать следующие расширения: https://stackoverflow.com/a/39674618/5381663

person kamil3    schedule 19.07.2017
comment
Я думаю, мы неправильно поняли друг друга. Я может неправильно объяснил. Я могу сохранить изображение как пейзаж или портрет, если я жестко закодирую UIImageOrientation после того, как снимок будет сделан. Тем не менее, я хочу определить, было ли устройство в альбомном или портретном режиме при съемке, чтобы я знал, как повернуть изображение. Это работает, но если у пользователя заблокирована ориентация на его устройстве, то это не имеет никакого эффекта. - person Christopher Smit; 19.07.2017