【问题标题】:Swift UIImage from CALayer crash来自CALayer崩溃的Swift UIImage
【发布时间】:2016-05-30 13:07:37
【问题描述】:

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

【问题讨论】:

  • 因为图层和上下文的大小为零?
  • 尝试使用图层边界大小而不是其帧大小?图层实际上没有框架
  • 啊,完全错过了,我犯了愚蠢的错误,你的权利,就行了!!
  • 把它作为答案。

标签: swift


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多