【问题标题】:Xcode SwiftUI Sharing custom image is blankXcode SwiftUI 共享自定义图像为空白
【发布时间】:2021-08-16 20:19:17
【问题描述】:

我正在尝试允许我的用户通过文本或社交媒体与叠加层共享图像。

我正在使用以下扩展程序成功创建图像(我知道是因为它显示在相册中):

extension View {
    func snapshot() -> UIImage {
        let controller = UIHostingController(rootView: self)
        let view = controller.view

        let targetSize = controller.view.intrinsicContentSize
        view?.bounds = CGRect(origin: .zero, size: targetSize)
        view?.backgroundColor = .clear

        let renderer = UIGraphicsImageRenderer(size: targetSize)

        return renderer.image { _ in
            view?.drawHierarchy(in: controller.view.bounds, afterScreenUpdates: true)
        }
    }
}

当我“分享”时,它会确认图像存在(分享表会更改其选项),但图像要么不存在,要么是一个空白的正方形。

我这样称呼它:

let myImage = textView.snapshot() //uses the snapshot extension above
ShareSheet(activityItems: ["my app name", myImage])

struct ShareSheet: UIViewControllerRepresentable {
    typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?) -> Void
    
    let activityItems: [Any]
    let applicationActivities: [UIActivity]? = nil
    let excludedActivityTypes: [UIActivity.ActivityType]? = nil ///[.postToFacebook]   //nil
    let callback: Callback? = nil
    
    func makeUIViewController(context: Context) -> UIActivityViewController {
        let controller = UIActivityViewController(
            activityItems: activityItems,
            applicationActivities: applicationActivities)
        controller.excludedActivityTypes = excludedActivityTypes
        controller.completionWithItemsHandler = callback
        return controller
    }
    func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
        // nothing to do here
    }
}

【问题讨论】:

  • 你能展示如何设置 myImage 的代码吗?理想情况下是minimal reproducible example?
  • 感谢您的帮助。编辑是否使上面更清楚?让 myImage = textView.snapshot()

标签: swiftui


【解决方案1】:

我知道这不是答案,但由于 cmets 非常有限, 我发布了一些代码,可能有助于找出它为什么不适合你。 对我来说,在 macos 12.beta5、xcode 13.beta5、target ios 15 和 macCatalyst 上似乎可行。这是我在测试中使用的代码:

import Foundation
import SwiftUI
import UIKit
import MobileCoreServices

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    @State var shareIt = false
    @State var myImage = UIImage(systemName: "globe")
    
    var body: some View {
        VStack (spacing: 55) {
            Image(uiImage: myImage!).resizable().frame(width: 222, height: 222)
            Button(action: {
                myImage = snapshot()
                shareIt = true
            }) {
                Text("Click to share")
            }
            .sheet(isPresented: $shareIt, onDismiss: {shareIt = false}) {
                ShareSheet(activityItems: [myImage as Any])
            }
        }
    }
}

extension View {
    func snapshot() -> UIImage {
        let controller = UIHostingController(rootView: self)
        let view = controller.view

        let targetSize = controller.view.intrinsicContentSize
        view?.bounds = CGRect(origin: .zero, size: targetSize)
        view?.backgroundColor = .clear

        let renderer = UIGraphicsImageRenderer(size: targetSize)

        return renderer.image { _ in
            view?.drawHierarchy(in: controller.view.bounds, afterScreenUpdates: true)
        }
    }
}

struct ShareSheet: UIViewControllerRepresentable {

    typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?) -> Void
    
    let activityItems: [Any]
    let applicationActivities: [UIActivity]? = nil
    let excludedActivityTypes: [UIActivity.ActivityType]? = nil ///[.postToFacebook]   //nil
    let callback: Callback? = nil
    
    func makeUIViewController(context: Context) -> UIActivityViewController {
        let controller = UIActivityViewController(
            activityItems: activityItems,
            applicationActivities: applicationActivities)

        controller.excludedActivityTypes = excludedActivityTypes
        controller.completionWithItemsHandler = callback
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) { }
}

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多