Swift - 在视图控制器中的 Sprite Kit 场景后面添加背景图像

Swift - Adding background image behind a Sprite Kit Scene in View Controller

我正在尝试在我的视图控制器中添加背景图像,以便我的 sprite 套件游戏场景可以在前景中。当游戏场景相互转换时,我的背景图像留在屏幕上对我来说很重要。我遇到的问题是如何将我为背景创建的子视图放在我的 skscene 后面,此时我的背景图像在我的游戏场景前面,你只能看到图像 sendSubviewToBack 没有'似乎不起作用。以下是我的viewDidLoad Thanks

import UIKit
import SpriteKit

class GameViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()
        let scene = MainMenuScene(size: CGSize(width: 1536, height: 2048))
        let skView = self.view as! SKView

        scene.scaleMode = .AspectFill
        skView.presentScene(scene)

        let backgroundImageView = UIImageView(image: UIImage(named: "bg.jpg"))
        backgroundImageView.frame = view.frame
        backgroundImageView.contentMode = .ScaleAspectFill
        view.addSubview(backgroundImageView)
        view.sendSubviewToBack(backgroundImageView)

    }
}

通常 UI 元素会根据它们添加到视图中的顺序放置在彼此之上。

如果您想自定义,您可以使用 属性 .layer.zPosition,这是您选择的任何值。最低值在最后面,最高值在最上面。

希望对您有所帮助:)

您可以使用 insertSubView: 而不是 addSubView 并指定索引,它确定视图的 z 顺序。具有较高索引的视图位于具有较低索引的视图之上。

您所描述的内容无法使用 UIKit 完成,因为您的视图在渲染场景的 SKView 后面不可见。

在iOS 8+你可以使用SKView的allowsTransparency 属性。文档状态:

This property tells the drawing system as to how it should treat the view. If set to NO, the drawing system treats the view as fully opaque, which allows the drawing system to optimize some drawing operations and improve performance. If set to YES, the drawing system composites the view normally with other content. The default value of this property is NO.

但在我看来这不是最好的解决方案。最好的解决方案是使用 Sprite Kit,但问题是您无法跨场景保留节点。您必须在每个场景转换期间再次添加节点。这就是为什么我不按照文档描述的方式使用 Apple 的场景转换。相反,我使用我自己的自定义 SKNodes 并使用这些节点进行我自己的自定义转换,我强烈建议您这样做。这个我已经详细回答了

制作一个带有背景纹理的SKSpriteNode!

background.size = self.frame.size //Make the background as big as the screen

我遇到了同样的问题,以下是解决方法:

  1. 将代码放在 viewWillLayoutSubviews() 中,而不是放在 viewDidLoad() 中 - 这将确保您可以访问所有视图的属性。
  2. 不要将 self.view 转换为 SKView,将其保留为 UIView,而是创建两个子视图:一个用于背景图像,一个用于 SKScene

这是更正后的代码:

var skView : SKView? = nil

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    if (skView == nil) {
        let backgroundImageView = UIImageView(image: UIImage(named: "bg.jpg"))
        view.addSubview(backgroundImageView)

        skView = SKView(frame: CGRect(origin: CGPointZero, size: CGSize(width: 1536, height: 2048)))
        skView!.ignoreSiblingOrder = true
        let scene = MainMenuScene(size: CGSize(width: 1536, height: 2048))
        scene.scaleMode = .AspectFill

        view.addSubView(skView!)
        skView!.presentScene(scene)
    }
}

我这样做的特殊原因是我可以制作一款可以在 iPhones 和 iPads 上玩的游戏,而不会出现纵横比失真。 'playable area' 始终是 16:9,当在 iPad 上看到时,您会看到一个延伸到可玩区域两侧的背景图像。

我所做的是加载 iPad 的背景图片(其纵横比为 4:3),定义 skView 的纵横比为 16:9 (例如,我使用 750/1334 而不是 1536/2048)并将场景的 scaleMode 设置为 .AspectFit。在 iPhone 上看到时,场景完全覆盖了背景。当在 iPad 上看到时,您可以看到背景图像与可玩区域的两侧相得益彰。

希望对您有所帮助!