【问题标题】:Why do iOS SpriteKit scene / view coordinates differ between iOS 7.1 and iOS 8?为什么 iOS SpriteKit 场景/视图坐标在 iOS 7.1 和 iOS 8 之间不同?
【发布时间】:2014-07-31 03:30:23
【问题描述】:

我正在探索 iOS 8 测试版的 SpriteKit,我的项目的部署目标设置为 iOS 7,这样我就可以在运行已发布的 iOS 7.1 的 iPad Air 上进行测试。

我发现我的SKScene 和它的SKView 之间的坐标在模拟器(运行 iOS 8)和我的设备(运行 iOS 7.1)之间不一致。这是我用来隔离不一致的代码:

从 iOS SpriteKit 游戏模板开始,我修改了设置,以便仅支持 横向右 方向,并且我已将以下代码添加到 GameScene 类:

class GameScene: SKScene {

    …

    var scaleFromView: CGPoint!

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        label = SKLabelNode(fontNamed:"Chalkduster")
        label.text = "Hello, World!";
        label.fontSize = 65;
        label.position = CGPoint(x:0.0, y:0.0);
        label.zPosition = -1.0

        let referencePt = CGPoint(x: 100, y: 100)
        var viewPt = convertPointToView(CGPoint(x: 0, y: 0))
        viewPt = viewPt + referencePt
        let scenePt = convertPointFromView(viewPt)
        scaleFromView = scenePt / referencePt
        println("  view.bounds is \(view.bounds)")
        println("   scene.size is \(scene.size)")
        println("scaleFromView is \(scaleFromView)")

        world.addChild(label)
    }

    …

请注意,这使用了我为使用 CGPoint 定义的一些运算符:

@infix func + (a: CGPoint, b: CGPoint) -> CGPoint {
    return CGPoint(x: a.x + b.x, y: a.y + b.y)
}

@infix func - (a: CGPoint, b: CGPoint) -> CGPoint {
    return CGPoint(x: a.x - b.x, y: a.y - b.y)
}

@infix func * (a: CGPoint, b: CGPoint) -> CGPoint {
    return CGPoint(x: a.x * b.x, y: a.y * b.y)
}

@infix func / (a: CGPoint, b: CGPoint) -> CGPoint {
    return CGPoint(x: a.x / b.x, y: a.y / b.y)
}

当在 iOS 8 模拟器的任何下运行时,包括 iPad Air 模拟,println 语句日志(正如我所期望的场景和视图边界设置):

  view.bounds is (0.0,0.0,1024.0,768.0)
   scene.size is (1024.0,768.0)
scaleFromView is (1.0,-1.0)

但是当我在我的设备上运行它时,我得到:

  view.bounds is (0.0,0.0,768.0,1024.0)
   scene.size is (1024.0,768.0)
scaleFromView is (0.75,-0.75)

因此,视图似乎没有正确反映它是横向的。 为什么会这样?

PS:我已经下载了 iOS 7.1 模拟器,现在可以报告它们与设备的行为一致。也就是说,这似乎是 iOS 7.1 的一个错误/功能。

【问题讨论】:

  • 你的意思是iOS 8中存在不一致,而不是7.1,对吧?通常,当在 viewDidLoad 而不是 viewWillLayoutSubviews 中创建 skview 时会发生坐标混淆,但不确定这如何适用于 swift/ios 8
  • @LearnCocos2D:对不起,我不清楚。不一致发生在 iOS 7.1 上,但在 iOS 8 上没有。我使用的是 Xcode 6 beta 中的 SpriteKit 游戏模板,因此在加载 nib 时会创建 SKView

标签: swift sprite-kit ios8


【解决方案1】:

下载并安装 iOS 7.1 模拟器后,我能够确定它们的行为与设备一致。也就是说,他们也报告了view.bounds 反映纵向而不是横向模式,即使(或者可能因为)我的应用程序仅是横向模式。

这似乎是 iOS 7.1 的错误/功能。

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多