SpriteKit布局问题(Swift)

时间:2015-08-24 17:41:19

标签: ios sprite-kit sklabelnode

我是SpriteKit和Swift的新手(过去在iOS中为Obj-C做了很多)但我正在努力做一些非常基本的事情......在屏幕上定位精灵!

在屏幕上居中标签似乎很容易:

myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

但是当我尝试放入屏幕的左下角或右上角时,它是不可见的:

//Bottom-left label
myLabel.horizontalAlignmentMode = .Left
myLabel.position = CGPoint(x: 0.0, y: self.size.height)

//Top-right label
myLabel.horizontalAlignmentMode = .Right
myLabel.position = CGPoint(x: self.size.width, y: self.size.height)

这是一个新项目,没有其他代码。我做错了什么,拜托?

2 个答案:

答案 0 :(得分:0)

您必须记住的是,默认情况下SpriteKit场景占用的范围远远超过屏幕。它的默认大小是1024 x 768,除非你另有说明,否则所有内容都会按比例缩放。在视图控制器中,您可以看到场景的初始化方式。你会发现它可能有一个类似

的陈述
scene.scaleMode = .AspectFill

这是这个的来源。文档中的Apple以直接的方式解释了当您使用AspectFill scaleMode时发生的情况:

  

计算每个维度的缩放因子,并选择两者中较大的一个。场景的每个轴都按相同的缩放因子缩放。这可以保证视图的整个区域都被填充,但可能会导致部分场景被裁剪。

还有其他可以探索的比例模式,您可以尝试,但Aspect Fill具有普遍性的巨大优势。

答案 1 :(得分:0)

您可以在创建SKScene时指定其大小。通常,您传递包含SKView的大小,以便它覆盖整个视图。如果设备旋转,则会调整视图大小(如果您的应用允许新方向)。我不确定SKScene是否调整大小。但无论哪种方式,您都需要更新场景内容的位置,以便例如标签位于右上方并带有新尺寸。

视图显示场景的视图控制器接收消息viewWillTransitionToSize(_ size:,withTransitionCoordinator coordinator:)。您可以将此方法子类化,以将消息发送到大小正在变化的呈现SKScene的自定义方法。然后,您可以使用新的大小重新定位节点,因为self.frame将更新。

myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

回到问题的核心!如何在场景的右上角放置标签?考虑到场景原点是左下角。对于SKLabelNode,该中心确实位于市中心。因此,抵消了标签尺寸的一半。

myLabel.position = CGPoint(x: self.size.width  - myLabel.size.width /2, 
                           y: self.size.height - myLabel.size.height/2)

顺便说一句,我从未看过一款iOS游戏,该游戏使用基于精灵的引擎(例如Sprite Kit或Cocos2d),它在同一设备上运行时支持设备旋转/多种屏幕尺寸( iPhone / iPad的)。