我正在使用 PocketSVG 框架来渲染 SVG 图像。该框架将 SVG 渲染到 CAShapeLayer 上,然后可以将其添加到 View 子层以显示 SVG。我想从这个 CAShapeLayer 生成一个 UIImage,但是执行此操作的代码似乎在 Swift 中不起作用。在 objective-c 中,这相当简单,我在下面使用了代码
- (UIImage *)imageFromLayer:(CALayer *)layer
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions([layer frame].size, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext([layer frame].size);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
我已经在 Objective-c 项目中对此进行了测试,效果很好。所以我将上面的代码转换为 Swift
func imageFromLayer (layer : CALayer) -> UIImage
{
if(UIScreen.mainScreen().respondsToSelector("scale"))
{
UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, UIScreen.mainScreen().scale)
}
else
{
UIGraphicsBeginImageContext(layer.frame.size)
}
layer.renderInContext(UIGraphicsGetCurrentContext()!)
let outputImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return outputImage
}
但是应用程序在这条线上崩溃了
layer.renderInContext(UIGraphicsGetCurrentContext()!)
说“ fatal error :在展开可选值时意外发现 nil”
有人知道为什么会这样吗?作为解决方法,我什至尝试将桥接头文件添加到我的 Swift 项目中,并添加了一个包含 imageFromLayer 方法的 Objective-c 类,但是当我在我的 Swift 类中运行此方法时,出现以下错误
<Error>: CGContextSetStyle: invalid context 0x0.
有人知道为什么在 Swift 中会发生这种情况吗?
最佳答案
尝试将整个 layer.frame.size
更改为 layer.bounds.size
。层实际上没有框架,除了作为一个光滑的派生概念,所以你最终得到一个零大小的图形上下文,这是无效的。
关于来自 CALayer 崩溃的 Swift UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35480245/