我正在Swift中构建一个单一的视图游戏,并且我一直在尝试为游戏添加渐变背景。我创建了一个处理所有渐变事物的新类,但是当我将它添加到场景中的背景时,它会显示在所有其他元素之上,而不是它所属的后面。
这是我写的东西。它从我写的单独类中获取颜色值。let background = CAGradientLayer().turquoiseColor()
background.frame = (self.view?.bounds)!
self.view?.layer.insertSublayer(background, atIndex: 0)
知道为什么要加在上面吗?
答案 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)
所以这个解决方案有四个步骤:
CAGradientLayer
并进行配置。确保将其框架设置为场景视图的框架。 UIView
,并将步骤1中的渐变添加为新UIView
的子图层。backgroundColor
属性设置为UIColor.clearColor()
。UIView
中的索引0处插入步骤2中的view
。我不确定为什么你不能直接将渐变图层添加到场景视图的图层,但这似乎有效。我的理论是,它与场景视图的渲染方式有关,并且所有图层都可能位于场景视图的渲染图之上(因此即使是索引0处的图层仍然位于顶部)。
注意:在我的示例中,sceneView
属性是我的Main.storyboard文件中的场景视图的@IBOutlet
,我将其从对象库拖放到默认的单视图应用程序视图控制器中。此代码位于ViewController.swift
viewDidLoad