您好,在这篇文章中提到的截图方法非常有效,能够解决很多SwiftUI下大部份场景的截图需求,但在最近使用过程中发现其对blur这类效果却无法支持,不知道有没有什么办法能够实现?
4条回答 默认 最新
关注 如果没有其它特殊需求,就用 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) } } } }
如果有其它需求可以试试这个,但可能在某些情况下会有问题:
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) } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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局部变量对蓝图不可见