UIDeviceOrientationの謎tipsになります。
忙しい人のためのアレ
- iOS9のiPadではUIDeviceOrientation.FaceUp .FaceDownが取得できなくなっている模様です
- Landscapeのときに
UIApplication.sharedApplication().statusBarOrientation
とUIDevice.currentDevice().orientation
が返す値はRightとLeftが逆になる - ビューのレイアウトをUIDeviceOrientationに追従させてはいけません
OS9のiPadではUIDeviceOrientation.FaceUp .FaceDownが取得できなくなっている模様です
iOS9のiPad系ではFaceUpとFaceDownが取れないようです。
UIDevice Class Referenceにも特に記述がなく。
下記の2通りの方法で確認しました。
- UIDeviceOrientationDidChangeNotificationの通知
- UIDevice.currentDevice().orientation
端末 | OS | FaceUp FaceDownとれた |
---|---|---|
iPad mini | iOS8 | YES |
iPad mini 2 | iOS8 | YES |
iPad Air | iOS7 | YES |
iPad mini 2 | iOS9 | NO |
iPad mini 4 | iOS9 | NO |
iPad Air 2 | iOS9 | NO |
手元のデバイスでも確認したい方はこちらのサンプルをどうぞ。
https://github.com/toshi0383/OrientationSample
これ、意外と困る人いるのでは?謎です。
iPhoneはiOS9でも大丈夫でした。
LandscapeのときにUIApplication.sharedApplication().statusBarOrientation
とUIDevice.currentDevice().orientation
が返す値はRightとLeftが逆になる
statusBarOrientationはホームボタンの位置、DeviceのOrientationはカメラの位置を指しているようです。
つまりこれは、iPhoneを右に傾けた状態です。
なにかの意図があるのでしょうか。まったくもって謎です。
追記:UIApplication.hのヘッダファイルに記載がありました。
// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
// This is because rotating the device to the left requires rotating the content to the right.
だそうです。
ビューの回転をUIDeviceOrientationに追従させてはいけません
最後にこれは特に謎ではないんですけど、
今日たまたま、UIDeviceOrientationDidChangeNotificationを契機に回転時のレイアウト処理をしているライブラリを使っていることによるバグに遭遇しました。
ポップオーバーが出ている状態でデバイスを回転しまくるとレイアウトが崩れるというやつです。
このライブラリはもう1年以上放置されていてiOS9とかもちろん対応していないしそらまともに動かんのだろうなーとか思っていたんですが、そういうレベルではなかったので共有したくなったというのがこのまとめのそもそもの動機でした。まとめる過程で上記の謎が出てきてしまいモヤモヤしましたが。。
そもそもの動機はそうなんですが、UIInterfaceOrientation使いましょうねというのが言いたかっただけなのでこれで以上になります。
おわり
最近は、Objective-Cで書かれた有名なライブラリでもだんだんメンテされなくなっているようで、既存のレガシーなアプリは結構辛い時期かもしれませんね。
まあこの記事を読んでいるような優秀なエンジニアの皆さんのところのイマドキなアプリだときっとSizeClassごとに気の利いたAdaptive Layoutがバッチリキマっていて orientation
でプロジェクトをgrepしてもヒットしなかったりするんでしょうから、関係ないですね!😎
それではみなさま楽しいプログラミングライフを。