在SpriteKit中使用CAGradientLayer?

时间:2014-05-28 16:37:38

标签: ios objective-c sprite-kit skspritenode cagradientlayer

我创建了一个CAGradientLayer,它工作得非常好。 但我的问题是,我想在SpriteKit中使用它作为背景......

是否有可能实现它? 也许把它放在SKSpriteNode中?

提前致谢

编辑:

不幸的是有一条错误消息:

5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextSaveGState:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。 5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextSaveGState:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。 5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextClipToRect:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。 5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextTranslateCTM:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。 5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextScaleCTM:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。 5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextDrawLinearGradient:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。 5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextRestoreGState:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。 5月28日19:08:19 amirs-mbp Gradient [2845]:CGContextRestoreGState:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。在即将到来的更新中,它将成为一个致命的错误。

3 个答案:

答案 0 :(得分:2)

我认为你会有更好的运气:

https://github.com/braindrizzlestudio/BDGradientNode

答案 1 :(得分:1)

首先将图层转换为UIImage *:

- (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;
}

然后用它初始化一个SKSpriteNode:

SKSpriteNode* node = [SKSpriteNode spriteNodeWithColor:[UIColor colorWithPatternImage:image] 
                                   size:yourLayer.bounds.size]

答案 2 :(得分:0)

此功能适用于从CAGradientLayer创建SpriteNode。请注意它是GameScene的一个功能,因此这就是“自我框架”。它所指的上下文获得正确的渐变大小。

func layerToSKSpriteNode(layer : CALayer) -> SKSpriteNode
{
    var view = UIView()
    layer.frame = self.frame
    view.layer.addSublayer(layer)

    UIGraphicsBeginImageContext(self.frame.size)
    view.layer.renderInContext(UIGraphicsGetCurrentContext())
    var bgImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return SKSpriteNode(texture: SKTexture(image: bgImage))
}