2014-11-20 2 views
27

Я пытаюсь заставить только одно представление в моем приложении на ландшафтном режиме, Я зовуForce ландшафтный режим в одном ViewController с помощью Swift

override func shouldAutorotate() -> Bool { 
    print("shouldAutorotate") 
    return false 
} 

override func supportedInterfaceOrientations() -> Int { 
    print("supportedInterfaceOrientations") 
    return Int(UIInterfaceOrientationMask.LandscapeLeft.rawValue) 
} 

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation { 
    return UIInterfaceOrientation.LandscapeLeft 
} 

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

+0

https://stackoverflow.com/a/46025791/2012219 – gbk

+0

Возможный дубликат [Как заставить ориентацию контроллера просмотра в iOS 8?] (Https://stackoverflow.com/questions/26357162/how-to-force -view-controller-orientation-in-ios-8) – gbk

ответ

44

Это может быть полезным для других, я нашел способ заставить вид запустить в ландшафтном режиме:

Поместите это в viewDidLoad():

let value = UIInterfaceOrientation.LandscapeLeft.rawValue 
UIDevice.currentDevice().setValue(value, forKey: "orientation") 

и

override func shouldAutorotate() -> Bool { 
    return true 
} 
+3

Я только что попробовал использовать это, и это не сработало; хотя изменение shouldAutorotate() возвращает false. Чтобы быть ясным: я хотел, чтобы он остался в Портрете, несмотря ни на что. (Также изменено UIInterfaceOrientation.LandscapeLeft для UIInterfaceOrientation.Портрет конечно) – milo526

+1

это потому, что ваш просмотр загружается в портретном режиме, и вы хотите, чтобы он оставался таким, мой просмотр загрузится в портретном режиме, и я хочу, чтобы он показывался в ландшафтном режиме. Если я помещу shouldAutorotate в NO, он не будет отображаться в Landscape – sazz

+1

Это не сработало для меня. – AbbasAngouti

2

Работает в Swift 2,2

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { 
    if self.window?.rootViewController?.presentedViewController is SignatureViewController { 

     let secondController = self.window!.rootViewController!.presentedViewController as! SignatureViewController 

     if secondController.isPresented { 

      return UIInterfaceOrientationMask.LandscapeLeft; 

     } else { 

      return UIInterfaceOrientationMask.Portrait; 
     } 

    } else { 

     return UIInterfaceOrientationMask.Portrait; 
    } 
} 
+0

Выполняется ли код выше в AppDelegate или просто в ViewController, который вы пытаетесь сделать на портрете? – Natalia

+0

в AppDelegate. –

13

Использование Swift 2,2

Try:

let value = UIInterfaceOrientation.LandscapeLeft.rawValue 
UIDevice.currentDevice().setValue(value, forKey: "orientation") 

Далее следуют:

UIViewController.attemptRotationToDeviceOrientation() 

От компании Apple UIViewController класса Reference:

Некоторые контроллеры просматривать можете использовать приложение конкретных условия для определения ориентации интерфейса. Если ваш контроллер просмотра делает это, когда эти условия меняются, ваше приложение должно вызывать этот метод класса. Система немедленно пытается повернуть на новую ориентацию.

Тогда, как и другие предложили, переопределить следующие методы в зависимости от обстоятельств:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
    return UIInterfaceOrientationMask.LandscapeLeft 
} 

override func shouldAutorotate() -> Bool { 
    return true 
} 

У меня была аналогичная проблема с точки зрения подписи, и это решил его для меня.

15

Swift 3

override func viewDidLoad() { 
    super.viewDidLoad() 
    let value = UIInterfaceOrientation.landscapeLeft.rawValue 
    UIDevice.current.setValue(value, forKey: "orientation") 
} 

private func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
    return UIInterfaceOrientationMask.landscapeLeft 
} 
    private func shouldAutorotate() -> Bool { 
    return true 
} 
1

Swift 3. Это запирает ориентацию каждый раз, когда пользователь повторно открывает приложение.

class MyViewController: UIViewController { 
    ... 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Receive notification when app is brought to foreground 
     NotificationCenter.default.addObserver(self, selector: #selector(self.onDidBecomeActive), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) 
    } 

    // Handle notification 
    func onDidBecomeActive() { 
     setOrientationLandscape() 
    } 

    // Change orientation to landscape 
    private func setOrientationLandscape() { 
     if !UIDevice.current.orientation.isLandscape { 
      let value = UIInterfaceOrientation.landscapeLeft.rawValue 
      UIDevice.current.setValue(value, forKey:"orientation") 
      UIViewController.attemptRotationToDeviceOrientation() 
     } 
    } 

    // Only allow landscape left 
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return UIInterfaceOrientationMask.landscapeLeft 
    } 

    /* 
    // Allow rotation - this seems unnecessary 
    private func shouldAutoRotate() -> Bool { 
     return true 
    } 
    */ 
    ... 
} 
-2
class CustomUIViewController : UIViewController{ 

    override var supportedInterfaceOrientations : UIInterfaceOrientationMask{ 

     return .landscapeLeft 

    } 

} 


class ViewController: CustomUIViewController { 
. 
. 
. 
} 
+0

Добро пожаловать в переполнение стека, как правильно ответить на вопрос о правильном ответе [здесь] (https: //stackoverflow.com/help/how-to-answer). –

0

Swift 4

Попытка не держать ориентации ничего не получалось, но это для меня:

...   
override func viewDidLoad() { 
     super.viewDidLoad() 
     forcelandscapeRight() 
     let notificationCenter = NotificationCenter.default 
     notificationCenter.addObserver(self, selector: #selector(forcelandscapeRight), name: Notification.Name.UIDeviceOrientationDidChange, object: nil) 
    } 

    @objc func forcelandscapeRight() { 
     let value = UIInterfaceOrientation.landscapeRight.rawValue 
     UIDevice.current.setValue(value, forKey: "orientation") 
    } 
.... 
8

Swift 4, испытано в IOS 11

Вы можете указать ori ентация в projectTarget -> Общие -> DeploymentInfo (ориентация устройства) -> Портрет (Landscapeleft и Landscaperight являются необязательными)

AppDelegate

var orientationLock = UIInterfaceOrientationMask.portrait 
    var myOrientation: UIInterfaceOrientationMask = .portrait 
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
     return myOrientation 
    } 

LandScpaeViewController

override func viewDidLoad() { 
     super.viewDidLoad() 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     appDelegate.myOrientation = .landscape 
} 

OnDismissButtonTap

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
appDelegate.myOrientation = .portrait 

Thats it. :)

+0

Отлично !!! Спасибо –

+0

поддержка edInterfaceOrientationsFor вызывается только в том случае, если устройство поворачивается один раз. –

1

Мне нужно было установить один контроллер в портретную ориентацию. Добавление этого сработало для меня.

быстры 4 с прошивкой 11

override var supportedInterfaceOrientations : UIInterfaceOrientationMask{ 

    return .portrait 

} 
1

Для меня лучшие результаты пришли из сочетания ответа Zeesha в ответ и Sazz в.

Добавьте следующие строки в AppDelegate.swift:

var orientationLock = UIInterfaceOrientationMask.portrait 
var myOrientation: UIInterfaceOrientationMask = .portrait 
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
    return myOrientation 
} 

Добавьте следующую строку в ваш вид класса контроллера:

let appDel = UIApplication.shared.delegate as! AppDelegate 

Добавьте следующие строки в ваш контроллера вида viewDidLoad():

appDel.myOrientation = .landscape 
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation") 

(необязательно) Добавить эту строку в вашу функцию увольнения:

appDel.myOrientation = .portrait 
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation") 

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

Смежные вопросы