У меня есть UIViewController, я хочу отключить или включить вращение экрана в разных сценариях
Пример:
if flag {
rotateDevice = false
}
else {
rotateDevice = true
}
Как я могу это сделать?
У меня есть UIViewController, я хочу отключить или включить вращение экрана в разных сценариях
Пример:
if flag {
rotateDevice = false
}
else {
rotateDevice = true
}
Как я могу это сделать?
У меня есть ответ. В AppDelegate
, если вы поворачиваете устройство, нажимаете viewcontroller и т.д. Эта функция всегда вызывает
Обновление для Swift 3/4
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask
{
return self.restrictRotation
}
self.restrictRotation
- это пользовательский параметр.
Как пользоваться:
В Appdelegate:
var restrictRotation:UIInterfaceOrientationMask = .portrait
В ViewController:
Когда вызывается метод ViewDidLoad или viewWillAppear. Мы изменимся так:
(UIApplication.shared.delegate as! AppDelegate).restrictRotation = .all
и тогда этот метод на AppDelegate будет вызван.
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask
Вы просто должны реализовать shouldAutorotate
и supportedInterfaceOrientations
в свой UIViewController
. Посмотрите на эту документацию. Например:
override func shouldAutorotate() -> Bool {
return true
}
Вы также можете указать, какие ориентации доступны. Вот пример только с ориентацией портретов:
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Landscape
}
Редактировать: Если вы хотите поддерживать различную ориентацию относительно флага, вам просто нужно сделать что-то вроде этого:
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if myFlag {
return .Landscape
} else {
return .All
}
}
(Если myFlag
верно, это позволит Landscape
ориентации. В противном случае, это позволит всем ориентациям).
Свифт 4
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
get {
return .portrait
}
}
В swift 5, как и в предыдущем случае, если вы хотите разрешить (избегать других) вращение определенного UIViewController в определенной ориентации, вы должны переопределить "supportInterfaceOrientations" внутри вашего класса UIViewController следующим образом:
class MyViewController:UIViewController{
override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get{
return .portrait
}
}
}
Здесь есть возможные варианты:
public struct UIInterfaceOrientationMask : OptionSet {
public init(rawValue: UInt)
public static var portrait: UIInterfaceOrientationMask { get }
public static var landscapeLeft: UIInterfaceOrientationMask { get }
public static var landscapeRight: UIInterfaceOrientationMask { get }
public static var portraitUpsideDown: UIInterfaceOrientationMask { get }
public static var landscape: UIInterfaceOrientationMask { get }
public static var all: UIInterfaceOrientationMask { get }
public static var allButUpsideDown: UIInterfaceOrientationMask { get }
}
расширенный
Если вы хотите различать iPad или iPhone, вы можете использовать UIUserInterfaceIdiom:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get{
return UIDevice.current.userInterfaceIdiom == .phone ? [.portrait, . portraitUpsideDown]:.all //OBS -> You can also return an array
}
}
где:
public enum UIUserInterfaceIdiom : Int {
case unspecified
@available(iOS 3.2, *)
case phone // iPhone and iPod touch style UI
@available(iOS 3.2, *)
case pad // iPad style UI
@available(iOS 9.0, *)
case tv // Apple TV style UI
@available(iOS 9.0, *)
case carPlay // CarPlay style UI
}
установить ориентацию устройства в Target → General → Deployment Info → Portrait