从CALayer创建Swift UIImage时崩溃

3

我正在使用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会出现这种情况吗?

因为该层,以及其上下文的大小均为零? - matt
1
尝试使用图层边界大小而不是其框架大小?实际上,图层并没有框架。 - matt
啊,我完全忽略了那个,是我犯的愚蠢错误,你说得对,那样做可以完成任务!! - AdamM
1
作为答案给出。 - matt
1个回答

5
尝试在整个代码中将layer.frame.size更改为layer.bounds.size。图层实际上没有框架,只是一个滑动的衍生概念,因此您最终会得到一个大小为零的图形上下文,这是无效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接