web-dev-qa-db-ja.com

Swiftでデバイスの向きを取得する

Swiftで現在のデバイスの向きをどのように取得できるのか疑問に思っていましたか? Objective-Cの例はありますが、Swiftで機能させることはできませんでした。

デバイスの向きを取得して、ifステートメントに入れようとしています。

これは私が最も問題を抱えている行です:

[[UIApplication sharedApplication] statusBarOrientation]
65
user3746428

次を使用できます:

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は非推奨ですviewWillTransitionToSizeiOS 2.0以降の場合

62
Miguel

使用しているObjective-Cコードのようなステータスバー(およびそのためのUI)の向きを取得するには、次のようにします。

UIApplication.sharedApplication().statusBarOrientation

UIDeviceの orientation property も使用できます。

UIDevice.currentDevice().orientation

ただし、これはUIの方向と一致しない場合があります。ドキュメントから:

プロパティの値は、デバイスの現在の向きを示す定数です。この値はデバイスの物理的な向きを表し、アプリケーションのユーザーインターフェースの現在の向きとは異なる場合があります。可能な値の説明については、「UIDeviceOrientation」を参照してください。

47
Mike S

Appleは最近、Landscape vs. Portraitのアイデアを取り除き、画面サイズを使用することを好みました。ただし、これは機能します。

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        print("landscape")
    } else {
        print("portrait")
    }
}
25
zSprawl
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の答え:これは私がそれをする方法です、

1.あらゆる種類のView Controllerに対応

2.ユーザーがアプリを回転させても機能する

3.初めてアプリをインストールする

19
Ernie Cheng

現在のデバイスの向きを見つけるには、次のコードを使用します。

UIApplication.sharedApplication()。statusBarOrientation

Swift 3.0の場合

UIApplication.shared.statusBarOrientation

13
Usman Nisar

Swift 4:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape {
            print("landscape")
        } else {
            print("portrait")
        }
    }
13
FBC

したがって、Appleがオリエンテーション文字列全体(「portrait」、「landscape」)を非推奨にしている場合、気にするのは幅と高さの比率だけです。 (@bpeditの答えのようなもの)

幅を高さで割ると、結果が1未満の場合、mainScreenまたはcontainer、または「portrait」「mode」にあるものがすべて表示されます。結果が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で、幅と高さが等しい場合に、条件を特に処理することについておそらくあまり気にしないと思います。)

9
Rob

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以降でのみ有効であることを指摘する必要があります。

8
bpedit

Swift 3+

基本的に:

NotificationCenter.default.addObserver(self, selector: #selector(self.didOrientationChange(_:)), name: .UIDeviceOrientationDidChange, object: nil)

@objc func didOrientationChange(_ notification: Notification) {
    //const_pickerBottom.constant = 394
    print("other")
    switch UIDevice.current.orientation {
        case .landscapeLeft, .landscapeRight:
            print("landscape")
        case .portrait, .portraitUpsideDown:
            print("portrait")
        default:
            print("other")
    }
}

:)

4
stakovereser

Swift、Robの回答に基づく

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if (size.width / size.height > 1) {
        print("landscape")
    } else {
        print("portrait")
    }
}
2
Johan Tingbacke
   override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (toInterfaceOrientation.isLandscape) {
        NSLog("Landscape");
    }
    else {
        NSLog("Portrait");
    }
}
2
Sanju

Obj-CコードのSwiftの代替コードが見つかりました

if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) 

if UIApplication.shared.statusBarOrientation.isLandscape

注:ステータスバーの向きが横向きかどうかを確認しようとしています。横向きの場合、ifステートメントはtrueです。

1
Akarsh SEGGEMU