来自CALayer的Swift UIImage崩溃

时间:2016-02-18 11:30:16

标签: swift

我正在使用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中发生这种情况?

1 个答案:

答案 0 :(得分:4)

尝试将layer.frame.size全程更改为layer.bounds.size。除了作为一个光滑的派生概念之外,图层实际上没有框架,因此您最终会得到零大小的图形上下文,这是无效的。

相关问题