如何将渐变背景添加到Swift playcene BEHIND所有其他元素?

时间:2016-06-26 14:22:51

标签: swift

我正在Swift中构建一个单一的视图游戏,并且我一直在尝试为游戏添加渐变背景。我创建了一个处理所有渐变事物的新类,但是当我将它添加到场景中的背景时,它会显示在所有其他元素之上,而不是它所属的后面。

这是我写的东西。它从我写的单独类中获取颜色值。

let background = CAGradientLayer().turquoiseColor()
background.frame = (self.view?.bounds)!
self.view?.layer.insertSublayer(background, atIndex: 0)

知道为什么要加在上面吗?

2 个答案:

答案 0 :(得分:2)

不要尝试将其添加为子图层。将渐变渲染到图像并将该图像设置为SKSpriteNode的纹理,然后将该节点添加到场景中例如:

     override func didMoveToView(view: SKView) {

        let size = CGSize(width: (self.view?.bounds.width)!,height: (self.view?.bounds.height)!)
        UIGraphicsBeginImageContextWithOptions(size, true, 1.0)
        let context = UIGraphicsGetCurrentContext()

        let gradient = CAGradientLayer().turquoiseColor()
        gradient.frame = CGRect(origin: CGPointZero, size: size)
        gradient.renderInContext(context!)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        let texture = SKTexture(image:image)
        let node = SKSpriteNode(texture:texture)
        node.anchorPoint = CGPointZero
        node.zPosition = -10.0
        self.addChild(node)
    }

答案 1 :(得分:0)

//1
let gradient = CAGradientLayer()
gradient.colors = [UIColor.lightGrayColor().CGColor, UIColor.blueColor().CGColor]
gradient.locations = [0, 1]
gradient.frame = sceneView.frame

//2
let background = UIView(frame: sceneView.frame)
background.layer.addSublayer(gradient)

//3
sceneView.backgroundColor = UIColor.clearColor()

//4
view.insertSubview(background, atIndex: 0)

所以这个解决方案有四个步骤:

  1. 首先,您创建一个CAGradientLayer并进行配置。确保将其框架设置为场景视图的框架。
  2. 接下来,使用场景视图的框架实例化UIView,并将步骤1中的渐变添加为新UIView的子图层。
  3. 重要提示:将“场景视图”的backgroundColor属性设置为UIColor.clearColor()
  4. 在视图控制器UIView中的索引0处插入步骤2中的view
  5. 我不确定为什么你不能直接将渐变图层添加到场景视图的图层,但这似乎有效。我的理论是,它与场景视图的渲染方式有关,并且所有图层都可能位于场景视图的渲染图之上(因此即使是索引0处的图层仍然位于顶部)。

    注意:在我的示例中,sceneView属性是我的Main.storyboard文件中的场景视图的@IBOutlet,我将其从对象库拖放到默认的单视图应用程序视图控制器中。此代码位于ViewController.swift

    中的默认viewDidLoad