hrk1988 2024-04-03 16:53 采纳率: 100%
浏览 16
已结题

SwiftUI下截图不支持blur

您好,在这篇文章中提到的截图方法非常有效,能够解决很多SwiftUI下大部份场景的截图需求,但在最近使用过程中发现其对blur这类效果却无法支持,不知道有没有什么办法能够实现?

  • 写回答

4条回答 默认 最新

  • 大熊猫侯佩 iOS开发领域优质创作者 2024-04-05 09:14
    关注

    如果没有其它特殊需求,就用 SwiftUI 原生的 ImageRenderer 即可:

    struct BlurDemoView: View {
        var body: some View {
            VStack {
                Text("This is some text.")
                    .padding()
                Text("This is some blurry text.")
                    .blur(radius: 2.0)
            }
        }
    }
    
    struct ContentView: View {
        
        @State var image: UIImage?
        let content = BlurDemoView()
        
        var body: some View {
            NavigationStack {
                VStack(spacing: 32) {
                    content
                    
                    if let image {
                        Image(uiImage: image)
                    }
                    
                    Button("截图") {
                        
                        let renderer = ImageRenderer(content: content)
                        renderer.scale = 1.0
                        
                        if let cgImage = renderer.cgImage {
                            image = UIImage(cgImage: cgImage)
                        }
                    }
                    .padding(.top)
                }
            }
        }
    }
    

    img

    如果有其它需求可以试试这个,但可能在某些情况下会有问题:

    extension View {
        func snapshotNew(scale: CGFloat) -> UIImage {
    
            let controller = UIHostingController(rootView: self)
            let view = controller.view!
        
            let format = UIGraphicsImageRendererFormat()
            format.scale = scale
            // 可以开启或关闭背景透明
            //format.opaque = true
                
            var targetSize = controller.view.intrinsicContentSize
            let topEdgeInset = UIApplication.shared.windows.first { $0.isKeyWindow }!.safeAreaInsets.top
            view.bounds = CGRect(origin: .init(x: 0, y: topEdgeInset / 2), size: targetSize)
            view.backgroundColor = .clear
                
            // 将 SwiftUI 视图对应的 UIView 加入渲染并设为可见
            //let window = UIWindow(frame: view.bounds)
            //window.addSubview(controller.view)
            //window.makeKeyAndVisible()
                
            let renderer = UIGraphicsImageRenderer(bounds: view.bounds, format: format)
            
            return renderer.image { rendererContext in
                view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
            }
        }
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月18日
  • 已采纳回答 4月10日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见