Swiftで現在のデバイスの向きをどのように取得できるのか疑問に思っていましたか? Objective-Cの例はありますが、Swiftで機能させることはできませんでした。
デバイスの向きを取得して、ifステートメントに入れようとしています。
これは私が最も問題を抱えている行です:
[[UIApplication sharedApplication] statusBarOrientation]
次を使用できます:
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以降の場合
使用しているObjective-Cコードのようなステータスバー(およびそのためのUI)の向きを取得するには、次のようにします。
UIApplication.sharedApplication().statusBarOrientation
UIDeviceの orientation
property も使用できます。
UIDevice.currentDevice().orientation
ただし、これはUIの方向と一致しない場合があります。ドキュメントから:
プロパティの値は、デバイスの現在の向きを示す定数です。この値はデバイスの物理的な向きを表し、アプリケーションのユーザーインターフェースの現在の向きとは異なる場合があります。可能な値の説明については、「UIDeviceOrientation」を参照してください。
Appleは最近、Landscape vs. Portraitのアイデアを取り除き、画面サイズを使用することを好みました。ただし、これは機能します。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
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.初めてアプリをインストールする
現在のデバイスの向きを見つけるには、次のコードを使用します。
UIApplication.sharedApplication()。statusBarOrientation
Swift 3.0の場合
UIApplication.shared.statusBarOrientation
Swift 4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
print("landscape")
} else {
print("portrait")
}
}
したがって、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で、幅と高さが等しい場合に、条件を特に処理することについておそらくあまり気にしないと思います。)
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以降でのみ有効であることを指摘する必要があります。
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")
}
}
:)
Swift、Robの回答に基づく
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if (size.width / size.height > 1) {
print("landscape")
} else {
print("portrait")
}
}
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
if (toInterfaceOrientation.isLandscape) {
NSLog("Landscape");
}
else {
NSLog("Portrait");
}
}
Obj-CコードのSwiftの代替コードが見つかりました
if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation))
は
if UIApplication.shared.statusBarOrientation.isLandscape
注:ステータスバーの向きが横向きかどうかを確認しようとしています。横向きの場合、ifステートメントはtrueです。