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

How can I modify the size of SpriteKit nodes in Swift?

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

backgroundNode.size = self.frame.size  

虽然这适用于 iPhone 6 Plus,但 iPhone 5 的较小 screen/lower 分辨率 表示其他节点的默认大小太大而无法适应它们的场景。

如何强制其他节点符合后台节点的大小? 我想将每个子视图的大小除以背景子视图的大小,但是不能直接对大小进行数学运算 属性.

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

UIKit UIView.framebounds 属性是一个 CGRect 结构,由相同的 CGSize and CGPoint 类型结构。

所以理解如何使用 CGRectCGSizeCGPoint 确实很有帮助。

请注意,CGRectCGSizeCGPoint 作为结构,在 Swift 中,总是按值传递给函数,而不是像 [=97 那样按引用传递=] 是,因此您不能修改传递给函数的结构内的字段,并且让它们传播回调用者的结构副本而不采取额外步骤。

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

例如:

  • 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

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

 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.