У меня есть ситуация, когда мое приложение иногда заставляет определенные контроллеры представления появляться в определенной ориентации.
Единственный способ сделать это - вручную установить ориентацию устройства и указать приложению попытаться повернуть себя так:
switch (forceOrientation){
case Orientations.PORTRAIT:
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
case Orientations.LANDSCAPE:
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
default:
break
}
Это работает просто отлично. Однако, как только я закрываю этот контроллер вида и возвращаюсь к предыдущему, я все еще нахожусь в принудительной ориентации независимо от того, как устройство удерживается. Есть ли способ установить значение ориентации на «грязный» или что-то в этом роде и автоматически определить его?
Я попытался установить значение ориентации на UIInterfaceOrientation.unknown.rawValue
и затем попытаться повернуть, но это не работает.
Я использую Swift 4.1
- Правка -
Чтобы уточнить, что я делаю, немного больше:
Когда мой контроллер представления создается, он устанавливает себя в качестве корневого контроллера представления (так, чтобы его настройки вращения действительно работали, в противном случае используется поведение root) В какой-то момент во время его инициализации можно сказать, что он должны быть ориентированы определенным образом. Если это так, то он выполняет приведенный выше код и также соответствующим образом устанавливает свою маску ориентации. Я использую эти переопределения:
public override var shouldAutorotate: Bool{
return allowOrientationChange // this is set at some point after initializing
}
public override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return orientationMask // this defaults to orientationMaskAll but is overridden
}
При закрытии контроллера представления предыдущий корневой контроллер добавляется обратно в качестве корневого. (Но он все равно поворачивается к тому, что было принудительно, и не обновляется, пока вы не переместите устройство)