iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Swift】iPad で UIActivityViewController の表示に気を付ける

iPhoneUIAlertController を表示させたことがある方なら馴染みがあると思いますが、UIAlertControllerUIActivityViewControlleriPad でそのまま表示処理を書いてしまうとランタイムエラーでクラッシュしてしまいます。

筆者も UIActivityViewController の表示で、iPad のための設定を忘れて Apple にリジェクトされてしまったので一応メモを残しておきます。

解決法

popoverPresentationControllersourceViewsourceRect に適当な値を設定することでクラッシュを回避することができます。sourceView では、ポップオーバーを表示させるための View を指定し、sourceRect でポップオーバーを表示する位置を設定しています。ポップオーバーの設定は iPhone では必要ないので、iPad のみで設定するようにしています。

        let uiActivityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
        if UIDevice.current.userInterfaceIdiom == .pad {
            let screenSize = UIScreen.main.bounds
            uiActivityViewController.popoverPresentationController?.sourceView = contextViewController.view
            uiActivityViewController.popoverPresentationController?.sourceRect = CGRect(x:screenSize.size.width/2, y: screenSize.size.height-200, width: 0, height: 0)
        }

ちなみに、ポップオーバーがどんなものかというのは下記の記事がわかりやすいので載せておきます。

【Swift4】UIPopoverPresentationControllerを使ってiPhone/iPad両対応のPopoverを出してみた - Qiita

iOS UIKitによるPopoverの表示およびカスタマイズ - Qiita

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com