Отключить ориентацию экрана в swift 4 для UINavigationController и UIViewController
Привет, я пытаюсь остановить авторотацию в одном из контроллеров представления в моем проекте. На снимке ниже,
У меня есть старт UINavigationController
а затем UIViewController
, Я реализовал следующий код для остановки авторотации:
extension UINavigationController {
override open var shouldAutorotate: Bool {
get {
return false
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
return UIInterfaceOrientationMask.landscape
}
}}
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override open var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask
{
return .landscape
}
}
Но приведенный выше код, похоже, не вызывает и не дает никакого эффекта. я использую Xcode 9
а также swift 4.0
, Любое предложение будет оценено.
С уважением, Нина
2 ответа
Создайте класс и установите его UINavigationController
, затем используйте этот новый класс в вашей раскадровке /XIB
В вашем расширении:
class NavigationController: UINavigationController {
override var shouldAutorotate: Bool {
return topViewController?.shouldAutorotate ?? super.shouldAutorotate
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return topViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
}
}
В вашем контроллере:
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
У меня была такая же проблема. Я просмотрел переполнение стека и перепробовал многие решения, но ни одно из них не сработало. Я нашел это решение на форумах разработчиков Apple, и оно сработало как шарм.
Я добавляю их решение здесь в надежде, что другим будет легче найти его в будущем, отдавая должное автору и ссылаясь на его пост.
Добавьте в свой файл AppDelegate:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
}
}
Добавьте к контроллеру представления, для которого вы хотите задать ориентацию:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
AppDelegate.AppUtility.lockOrientation(.portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
AppDelegate.AppUtility.lockOrientation(.all)
}
Это просто пояснение к ответу TagTaco выше.
создать собственный класс
class CustomUINavigationController: UINavigationController {
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
}
Теперь вы можете создать такой контроллер навигации:
let navController = CustomUINavigationController(rootViewController: YourController())
Надеюсь, это кому-то поможет. Ура.