iPhone で UIAlertController
を表示させたことがある方なら馴染みがあると思いますが、UIAlertController
や UIActivityViewController
は iPad
でそのまま表示処理を書いてしまうとランタイムエラーでクラッシュしてしまいます。
筆者も UIActivityViewController
の表示で、iPad
のための設定を忘れて Apple
にリジェクトされてしまったので一応メモを残しておきます。
解決法
popoverPresentationController
の sourceView と sourceRect に適当な値を設定することでクラッシュを回避することができます。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