2016年12月3日土曜日

LandscapeでimagePickerがうまく表示されない

PortraitとLandscapeの両方に対応したアプリ作ってる。
写真ライブラリから選ぶためのUIImagePickerControllerが、公式にはPortrait表示にしか対応していないらしく、Landscapeで表示しようとすると強制的にPortrait表示になってしまう。(iPhoneだけ。iPadではうまくいく)
また、プロジェクトの設定でLandscape以外許可しない状態で表示しようとすると、クラッシュしてしまう。
こういうアプリで
こうしたいのに

こうなっちゃう!?
今まで気にしたことなんかなかったけど、LandscapeのimagePickerって普通になかったっけ? iPadだけでiPhone持ってないから知らなかっただけ?

UIImagePickerControllerのAPIリファレンスには以下のように書かれている。

Important
The UIImagePickerController class supports portrait mode only. This class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified, with one exception. You can assign a custom view to the cameraOverlayView property and use that view to present additional information or manage the interactions between the camera interface and your code.

和訳(by おいら)
重要

UIImagePickerControllerクラスは、縦画面モードだけをサポートします。 このクラスは現状のままで使われることを目的として、サブクラスとすることをサポートしません。 このクラスのためのビューの階層はprivateで、例外的に修正されてはいけません。 あなたはカスタムビューをcameraOverlayViewのプロパティに割り当てることができて、追加情報を提示するか、カメラインターフェースとコードの間の相互作用を管理するために、そのビューを使うことができます。


どうやらUIImagePickerControllerをサブクラスにしたカスタムクラスを作ることも禁止されているらしい。禁を破って作ると、リジェクトされるという噂もあるらしい。
でもネット情報だとカスタムクラス作ったり、overrideして実現しちゃってるみたい。

ViewController.swift あたりのclassの外に以下を書いておけばいい。
extensionは既存クラスを書き換えたり、繼承なしで機能を拡張するためのもの。

extension UIImagePickerController
{
    override open var supportedInterfaceOrientations:UIInterfaceOrientationMask {
        return .all
    }
}


ちなみにSwift2.xでは以下の書き方だった。
extension UIImagePickerController
{
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return .All
    }
}

Swift3.0からsupportedInterfaceOrientationsの定義が変更になったらしく、override open var〜で書かないと
method does not override any method from its superclass
なんてエラーが出ちゃう。
関数だったものが変数になったのね? なんだかよくわかんないけど。

無事に表示できたけど、このことが理由でリジェクトされないといいけどな。まあ海外のデベロッパー含めてやってるみたいだから大丈夫なのでは?
そもそもなんでLandscape表示もできるのに、Portrait表示しか対応してないって言ってるんだろうね?

参考

0 件のコメント:

コメントを投稿