ios - 如何在 Swift 中修改 SpriteKit 节点的大小?

标签 ios swift sprite-kit swift3 skspritenode

在我的应用程序中,对于一个屏幕,我正在设置大小并使 SpriteKit 节点的背景居中。例如,我将背景 subview 的大小设置如下:

backgroundNode.size = self.frame.size  

虽然这适用于 iPhone 6 Plus,但 iPhone 5 的较小屏幕/较低分辨率意味着其他节点的默认大小太大而无法适合他们的场景。

如何强制其他节点符合后台节点的大小? 我想将每个 subview 的大小除以背景 subview 的大小,但不能直接在大小属性上进行数学运算。

最佳答案

SpriteKit场景(SKScene)包含节点,节点(SKNode),其中有 sizeposition 属性(类型分别为 CGSizeCGPoint)。

UIKit UIView . framebounds属性是 CGRect结构由相同的 CGSize 组成和 CGPoint类型结构。

因此,了解如何使用 CGRectCGSizeCGPoint 确实很有帮助。

请注意,CGRectCGSizeCGPoint 作为结构,在 Swift 中,总是按值传递给函数,而不是按引用传递类是,因此您不能修改传递给函数的结构内部的字段,并且在不采取额外步骤的情况下将它们传播回结构的调用者副本。

因为大小和位置属性是复合类型,所以不能像简单的标量一样在数学和逻辑运算中使用它们;因为它们包含多个属性。

例如:

  • CGSize 包含 widthheight 属性,
  • CGPointxy 属性组成。

如果要划分大小,您必须单独访问 CGSize 结构的宽度和高度属性。

您可以在一个操作中分配大小(即单个构造函数):

node.size = CGSize(
   width:  node.size.width  / backgroundNode.size.width,
   height: node.size.height / backgroundNode.size.height)

或者您可以谨慎地进行:

node.size.width  = node.size.width  / backgroundNode.size.width
node.size.height = node.size.height / backgroundNode.size.height

处理 CGRect 字段时,有时将其作为单个实体处理会很有用。例如,

 view.frame = CGRect(x: 0, y: 0, width: 10, height: 10)

其他一些时候单独设置sizeorigin属性更实用:

 view.frame.origin = CGPoint (x: 0, y: 0)
 view.frame.size   = CGSize  (width: 10, height: 10)

甚至:

 view.frame.origin.x     = 0
 view.frame.origin.y     = 0
 view.frame.size.width   = 10
 view.frame.size.height  = 10

还值得了解每个结构的“零”静态属性,作为方便的简写等价物:

 CGRect .zero   ...    CGRect  (x: 0, y: 0, width: 0, height: 0)
 CGPoint.zero   ...    CGPoint (x: 0, y: 0)
 CGSize .zero   ...    CGSize  (width: 0, height: 0)
If you do a lot of adjusting of size and position, to reduce code bloat, you might consider borrowing or developing convenient Swift extensions to `CGRect, CGSize and CGPoint` to simplify applying delta values to sizes or origins.

关于ios - 如何在 Swift 中修改 SpriteKit 节点的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41422685/

相关文章:

ios - 如何在 SpriteKit 中使用物理原理让移动的 Sprite 掉落

ios - SpriteKit 坐标的转换

iOS - 如何限制特定用户在不同设备上的应用程序安装

iphone - 如何在 Info.plist 中设置多个 url schemes

ios - 未调用 UICollectionView 的 didSelectItemAtIndexPath

arrays - 使用多个索引 :[Int] 枚举多线性映射的 Swift 算法

ios - Xcode错误: Failed to set () user defined inspected property: this class is not key value coding-compliant for the key

swift 3 (SpriteKit) : Stop weak SKSpriteNode from becoming nil after initialisation

ios - 选项卡栏项目图像不显示

ios - 使用 RSA 私钥签署字符串