iPadでImagePickerを使用してクラッシュしており、
それが原因でリジェクトされてしまったので記録用に残しておきます。

原因となったソース

    /// 画像の設定ボタンをタップ
    ///
    /// - Parameter sender: btnValue
    @IBAction func tapValueBtn(_ sender: UIButton) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {

            let picker = UIImagePickerController()
            picker.modalPresentationStyle = .popover
            picker.delegate = self
            picker.sourceType = .photoLibrary
            picker.allowsEditing = true

            if let popover = picker.popoverPresentationController {
                popover.sourceView = self.view
                popover.sourceRect = self.view.frame
                popover.permittedArrowDirections = .any
            }

            self.present(picker, animated: true, completion: nil)
        }
    }

そもそもiPadではImagePickerをpopoverで開かなければならないため、
if let popover = picker.popoverPresentationController { の中がその対応のつもりでした。

ですが、
popover.sourceRect = self.view.frame 

popover.permittedArrowDirections = .any
との相性が悪かったのです。

popover.sourceRect = self.view.frame 
は、popoverをどの位置に出すか?という意味。
真ん中でいいかなと思って、自身のviewを設定していました。

popover.permittedArrowDirections = .any
は、popoverの吹き出しの三角をどの位置に出すか?という意味。
upやdownで明示的に指定することもできますが、特に考えずanyを設定していました。
anyは、sourceRectに応じていい感じの向きで出しますよ、という意味。

つまり、この三角が出せなかったようなのです。
確かに、popover全体が自身のviewの上に乗っていたら、三角は出せないですよね…。



popoverをただ真ん中に出したい場合は、三角を消せばOKです。

    /// 画像の設定ボタンをタップ
    ///
    /// - Parameter sender: btnValue
    @IBAction func tapValueBtn(_ sender: UIButton) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {

            let picker = UIImagePickerController()
            picker.modalPresentationStyle = .popover
            picker.delegate = self
            picker.sourceType = .photoLibrary
            picker.allowsEditing = true

            if let popover = picker.popoverPresentationController {
                popover.sourceView = self.view
                popover.sourceRect = self.view.frame
                popover.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) // 三角を消す
            }

            self.present(picker, animated: true, completion: nil)
        }
    }

もしくは、ボタンを押してpopoverを出す場合はボタンから吹き出しを出すイメージでもいいと思います。
その場合はこちら。

    /// 画像の設定ボタンをタップ
    ///
    /// - Parameter sender: btnValue
    @IBAction func tapValueBtn(_ sender: UIButton) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {

            let picker = UIImagePickerController()
            picker.modalPresentationStyle = .popover
            picker.delegate = self
            picker.sourceType = .photoLibrary
            picker.allowsEditing = true

            if let popover = picker.popoverPresentationController {
                popover.sourceView = self.view
                popover.sourceRect = sender.frame
                popover.permittedArrowDirections = .any
            }

            self.present(picker, animated: true, completion: nil)
        }
    }

というより、対応したつもりでもちゃんと申請前には確認しないといけませんよね;
反省です…。

スポンサーリンク