我正在使用PocketSVG框架来渲染SVG图像。该框架将SVG渲染到CAShapeLayer上,然后可以将其添加到视图子层以显示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()!)
说“致命错误:在打开可选值时意外发现nil”
有谁知道为什么会这样?作为解决方法,我甚至尝试在我的Swift项目中添加一个桥接头文件,并添加了一个包含imageFromLayer方法的Objective-c类,但是当我在Swift类中运行此方法时,我收到以下错误
<Error>: CGContextSetStyle: invalid context 0x0.
任何人都有任何想法为什么在Swift中发生这种情况?
答案 0 :(得分:4)
尝试将layer.frame.size
全程更改为layer.bounds.size
。除了作为一个光滑的派生概念之外,图层实际上没有框架,因此您最终会得到零大小的图形上下文,这是无效的。