Прочитайте ориентацию устройства, даже если портрет включен только [дубликат]

Выполнить pytest как модуль с: python -m pytest tests

50
задан user3746428 11 September 2014 в 21:40
поделиться

10 ответов

У меня возникли проблемы с использованием InterfaceOrientation, он работал нормально, за исключением того, что он не обращался к ориентации при загрузке. Поэтому я попробовал это, и это хранитель. Это работает, потому что bounds.width всегда ссылается на текущую ориентацию, а не на nativeBounds.width, которая является абсолютной.

    if UIScreen.mainScreen().bounds.height > UIScreen.mainScreen().bounds.width {
        // do your portrait stuff
    } else {    // in landscape
        // do your landscape stuff
    }

Я вызываю это из willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) и из viewDidLoad, но он гибкий .

Благодаря zSprawl для указателя в этом направлении. Я должен отметить, что это хорошо только для iOS 8 и более поздних версий.

7
ответ дан bpedit 31 August 2018 в 22:08
поделиться

вы можете использовать:

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
    var text=""
    switch UIDevice.currentDevice().orientation{
    case .Portrait:
        text="Portrait"
    case .PortraitUpsideDown:
        text="PortraitUpsideDown"
    case .LandscapeLeft:
        text="LandscapeLeft"
    case .LandscapeRight:
        text="LandscapeRight"
    default:
        text="Another"
    }
    NSLog("You have moved: \(text)")        
}

SWIFT 3 UPDATE

override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
    var text=""
    switch UIDevice.current.orientation{
    case .portrait:
        text="Portrait"
    case .portraitUpsideDown:
        text="PortraitUpsideDown"
    case .landscapeLeft:
        text="LandscapeLeft"
    case .landscapeRight:
        text="LandscapeRight"
    default:
        text="Another"
    }
    NSLog("You have moved: \(text)")        
}

или

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
}

с уведомлением вы можете проверить: IOS8 Swift: как определить изменение ориентации?

ПРИМЕЧАНИЕ: didRotateFromInterfaceOrientation устарела Использовать viewWillTransitionToSize для iOS 2.0 и более поздних версий

52
ответ дан Chathuranga Silva 31 August 2018 в 22:08
поделиться
struct DeviceInfo {
struct Orientation {
    // indicate current device is in the LandScape orientation
    static var isLandscape: Bool {
        get {
            return UIDevice.current.orientation.isValidInterfaceOrientation
                ? UIDevice.current.orientation.isLandscape
                : UIApplication.shared.statusBarOrientation.isLandscape
        }
    }
    // indicate current device is in the Portrait orientation
    static var isPortrait: Bool {
        get {
            return UIDevice.current.orientation.isValidInterfaceOrientation
                ? UIDevice.current.orientation.isPortrait
                : UIApplication.shared.statusBarOrientation.isPortrait
        }
    }
}}

swift4 answer: вот как я это делаю,

1.works для всех видов контроллера вида

2. также работает, когда пользователь поворачивает приложение

3.также в первый раз установите приложение

8
ответ дан Ernie Cheng 31 August 2018 в 22:08
поделиться

Swift 4:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape {
            print("landscape")
        } else {
            print("portrait")
        }
    }
7
ответ дан FBC 31 August 2018 в 22:08
поделиться

Swift 3, основанный на ответе Роба

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if (size.width / size.height > 1) {
        print("landscape")
    } else {
        print("portrait")
    }
}
2
ответ дан Johan Tingbacke 31 August 2018 в 22:08
поделиться

Чтобы получить строку состояния (и, следовательно, UI), такую ​​как код Objective-C, вы просто:

UIApplication.sharedApplication().statusBarOrientation

Вы также можете использовать свойство orientation UIDevice:

UIDevice.currentDevice().orientation

Однако это может не совпадать с ориентацией вашего пользовательского интерфейса. Из документов:

Значение свойства является константой что указывает на текущую ориентацию устройства. Это значение представляет физическую ориентацию устройства и может отличаться от текущей ориентации пользовательского интерфейса вашего приложения. См. «UIDeviceOrientation» для описания возможных значений.

39
ответ дан Mike S 31 August 2018 в 22:08
поделиться

Итак, если Apple обесценивает всю вещь ориентировочной строки («портрет», «пейзаж»), тогда вам все равно будет отношение ширины к высоте. (вроде как ответ @ bpedit)

Когда вы разделите ширину на высоту, если результат меньше 1, то mainScreen или контейнер или что-то еще находится в режиме «портрет». Если результат больше 1, это «пейзажная» живопись. ;)

override func viewWillAppear(animated: Bool) {
    let size: CGSize = UIScreen.mainScreen().bounds.size
    if size.width / size.height > 1 {
        print("landscape")
    } else {
        print("portrait")
    }
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if size.width / size.height > 1 {
        print("landscape")
    } else {
        print("portrait")
    }
}

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

7
ответ дан Rob 31 August 2018 в 22:08
поделиться
   override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (toInterfaceOrientation.isLandscape) {
        NSLog("Landscape");
    }
    else {
        NSLog("Portrait");
    }
}
2
ответ дан Sanju 31 August 2018 в 22:08
поделиться

Чтобы найти текущую ориентацию устройства, просто используйте этот код:

UIApplication.sharedApplication (). statusBarOrientation

для swift 3.0

UIApplication.shared.statusBarOrientation

11
ответ дан Usman Nisar 31 August 2018 в 22:08
поделиться

Apple недавно избавилась от идеи «Ландшафт против портрета» и предпочитает использовать размер экрана. Однако это работает:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        print("landscape")
    } else {
        print("portrait")
    }
}
19
ответ дан zSprawl 31 August 2018 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: