在SpriteKit中使用AspectFit显示边框外的内容

时间:2016-02-21 15:15:54

标签: ios iphone xcode swift sprite-kit

当我对不匹配场景宽高比的设备使用.AspectFit缩放模式时,我试图在场景边框外显示内容。我的场景设置为iPhone 5& 6纵横比(1080 x 1920)并且在黄色边界线定义的区域之外有一些测试节点:

enter image description here

白色屏幕周围的粗红线就在边框之外,除非内容是letterboxed,否则不应该看到。

这是我的视图控制器中显示场景的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    if let scene = GameScene(fileNamed:"MainMenu") {
        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFit
        skView.presentScene(scene)
    }
}

当我在iPhone 6s模拟器中运行时,我看到了预期的结果,这只是角落里的方块。但是,当我在4s模拟器中运行它时,而不是右侧和左侧的红色条,我看到黑条:

enter image description here

当场景调整大小以适应屏幕时,如何告诉视图控制器/应用程序使用场景内容而不是黑色空白来填充额外空间?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并提出了一些可行的“ hacky”方法。继续使用.aspectFit并动态调整内容的外观以匹配屏幕。

此代码假定您在.sks文件中使用默认的0.5、0.5锚点,并且需要将originalSize设置为设计场景时使用的原始大小。

任何使用此方法的人都可以为它添加一些错误检查和/或对其进行优化,这样它就不会在每个帧上连续运行。

override func update(_ currentTime: TimeInterval) {
    // hacky resize
    do {
        let originalSize = CGSize(720, 1140)
        let winSize = self.view!.frame.size
        let originalAspect = originalSize.width/originalSize.height
        let winAspect = winSize.width/winSize.height
        var newSize = originalSize; do {
            if winAspect > originalAspect {
                newSize.width = originalSize.height * winAspect
            } else if winAspect < originalAspect {
                newSize.height = originalSize.width / winAspect
            }
        }
        self.size = newSize
        self.scaleMode = .aspectFit
    }
}