UIGraphics无法生成cgImage,游戏平铺管道图片渲染失败求解决
修复建议:SwiftUI平铺管道图片渲染问题
你的代码存在几个关键问题,导致调整大小后的平铺图片无法正常渲染,以下是具体修复方案:
问题1:强制解包触发崩溃
初始状态下reImage为nil,直接使用Image(uiImage: reImage!)会引发运行时崩溃,替换为可选绑定的安全写法:
if let reImage = reImage { Image(uiImage: reImage) .resizable() .scaledToFit() } else { Text("未生成图片") .foregroundColor(.gray) }
问题2:绘图上下文未适配Retina屏幕
UIGraphicsBeginImageContext不支持Retina屏幕,会导致生成的图片模糊或渲染异常。改用支持屏幕缩放的初始化方法:
// 替换原UIGraphicsBeginImageContext(size) UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
第三个参数传0.0会自动匹配当前设备的屏幕缩放比例,保证图片清晰度。
问题3:坐标系不匹配导致平铺异常
Core Graphics与UIKit的坐标系Y轴方向相反,直接使用CGContext的draw(_:in:byTiling:)会导致图片翻转,且平铺逻辑不符合预期。改用UIImage的drawAsPattern(in:)方法,自动处理平铺和坐标系适配:
修改后的resizeImage函数:
func resizeImage(textures: (pipe: String, cap: String), of size: CGSize) -> UIImage? { guard let textureUIImage = UIImage(named: textures.pipe) else { return nil } UIGraphicsBeginImageContextWithOptions(size, false, 0.0) textureUIImage.drawAsPattern(in: CGRect(origin: .zero, size: size)) let tiledImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return tiledImage }
完整修复代码
import SwiftUI struct ContentView: View { @State var reImage: UIImage? var body: some View { VStack { Image("pipe-green") .resizable() .scaledToFit() if let reImage = reImage { Image(uiImage: reImage) .resizable() .scaledToFit() } else { Text("未生成图片") .foregroundColor(.gray) } Button("生成平铺管道") { let sizeNew = CGSize(width: 100, height: 300) reImage = resizeImage(textures: (pipe: "pipe-green", cap: "bottom-green"), of: sizeNew) } } .padding() } func resizeImage(textures: (pipe: String, cap: String), of size: CGSize) -> UIImage? { guard let textureUIImage = UIImage(named: textures.pipe) else { return nil } UIGraphicsBeginImageContextWithOptions(size, false, 0.0) textureUIImage.drawAsPattern(in: CGRect(origin: .zero, size: size)) let tiledImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return tiledImage } }
内容的提问来源于stack exchange,提问作者Dakata
相关产品推荐
相关产品推荐

