@KokumaruGarasu (kabuki)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Viewを画像として共有したい

解決したいこと

iPhoneで健康状態を記録、送信するアプリを制作しています。
Viewを画像として共有できるようにしたいと考えています。
実行環境はxcode12.0.1,swift5です。
初学者なので、もし回答に際して不足している情報等あれば
指摘していただけると
幸いです。

発生している問題・エラー

Fatal error: Unexpectedly found nil while unwrapping an Optional valueと表示され、Viewが正しく取得されていないようです。

スクリーンショット 2020-10-16 11.06.46.png

該当するソースコード

ViewをUIviewとして取得するまでは以下の記事を参考にさせて頂きました。

https://qiita.com/tsuzuki817/items/a3d2470ba9df07ed0d99
https://qiita.com/tsuzuki817/items/604d059aac3e14f65942

struct RectangleGetter: View {
    @Binding var rect: CGRect

    var body: some View {
        GeometryReader { geometry in
            self.createView(proxy: geometry)
        }
    }

    func createView(proxy: GeometryProxy) -> some View {
        DispatchQueue.main.async {
            self.rect = proxy.frame(in: .global)
        }
        return Rectangle().fill(Color.clear)
    }
}

UIViewからUIImageへの変換は以下のようにUIGraphicsImageRendererを
利用しています。

extension UIView {
    func getImage(rect: CGRect) -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: rect)
        return renderer.image {
            rendererContext in layer.render(in: rendererContext.cgContext)
        }
    }
}
0 likes

2Answer

self.uiImage!で強制アンラップしていますが、nilが入ってきているのでエラーが出ているようですね。

1Like

Comments

  1. @KokumaruGarasu

    Questioner

    ご回答ありがとうございます。ご指摘の通り、nilが入ることによるエラーでした。
    それを受けて共有ボタンを変更したところ解決しました。




ご回答のおかげで無事解決しました!
共有ボタンを以下のようにすることによって、エラーの解消と画像としての共有に成功しました。


Button(action: {
     self.uiImage = UIApplication.shared.windows[0].rootViewController?.view!.catchImage(rect: self.rect);         
     self.showActivityView = true
      })
    { Image(systemName: "square.and.arrow.up"  }
        .sheet(isPresented: self.$showActivityView){
                                ActivityView(
                                    activityItems: [uiImage],
                                    applicationActivities: nil
                                )
                            }
0Like

Your answer might help someone💌