【发布时间】: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