来自 CALayer 崩溃的 Swift UIImage

标签 swift

我正在使用 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/

相关文章:

swift - 在顶部 TableView 中对降序排列的日期进行排序

xcode - 在一个 NSURLSession.sharedSession 上运行 2 个任务

ios - 通过单击主视图中的按钮更改容器 View 中的按钮标签

swift - 标签栏按钮启动新屏幕?

swift - Clipped Image 在框架外调用 TapAction

ios - 如何使用 keyboardDismissMode = .interactive 为键盘滚动设置动画

swift - 在 Swift 中一次选择多个 TableView 单元格

swift - 使用 Youtube 播放器库关闭视频

ios - swift 与 Objective-C : App performance

ios - 在 Tab Bar 前面制作 UIPickerView