Принудительный ландшафтный режим в одном 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
}
представление запускается в портретном режиме и продолжает вращаться при изменении ориентации устройства.
В shouldAutorotate никогда не вызывается.
Любая помощь будет оценена.
11 ответов
это может быть полезно для других, я нашел способ заставить представление запускаться в ландшафтном режиме:
поместите это в viewDidLoad ():
let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
и
override func shouldAutorotate() -> Bool {
return true
}
Swift 4
override func viewDidLoad() {
super.viewDidLoad()
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscapeLeft
}
override var shouldAutorotate: Bool {
return true
}
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
}
Использование Swift 2.2
попробуй:
let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
Затем:
UIViewController.attemptRotationToDeviceOrientation()
из ссылки на класс UIViewController от Apple:
некоторые контроллеры представления могут использовать специфические для приложения условия, чтобы определить, какие ориентации интерфейса поддерживаются. Если ваш контроллер представления делает это, когда эти условия изменяются, ваше приложение должно вызвать этот метод класса. Система немедленно пытается повернуть к новому ориентация.
затем, как предлагали другие, переопределите следующие методы по мере необходимости:
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.LandscapeLeft
}
override func shouldAutorotate() -> Bool {
return true
}
у меня была аналогичная проблема с представлением подписи, и это решило ее для меня.
Swift 4 , проверен в iOS 11
вы можете указать ориентацию в 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
вот и все. :)
Мне нужно было заставить один контроллер в портретную ориентацию. Добавление этого сработало для меня.
swift 4 с iOS 11
override var supportedInterfaceOrientations : UIInterfaceOrientationMask{
return .portrait
}
для меня, лучшие результаты пришли из сочетания ответов Zeesha и ответить sazz это.
добавьте следующие строки в AppDelegate.Свифт:
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")
(необязательно) добавьте эту строку в функцию dismiss:
appDel.myOrientation = .portrait
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
что эти строки кода делают, это установить ориентацию по умолчанию на портрет, поверните его пейзаж при загрузке контроллера вида, а затем, наконец, сбросьте его обратно в портрет после закрытия контроллера вида.
работает в 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;
}
}
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
}
*/
...
}
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")
}
....
по словам документация supportedInterfaceOrientations на shouldAutorotate
метод должен возвратить true
или YES
в Objective-C так что есть.
class CustomUIViewController : UIViewController{
override var supportedInterfaceOrientations : UIInterfaceOrientationMask{
return .landscapeLeft
}
}
class ViewController: CustomUIViewController {
.
.
.
}