调整SKShapeNode框架大小,或者替代方法

3
这个问题与这个链接有关:将SKShapeNode框架设置为calculateAccumutedFrame 有没有一种方法可以调整SKShapeNode的框架大小,而不是缩放它(建议在此处:调整SKShapeNode的大小)。使用任何缩放函数都会使其内容缩小和调整大小(200x200的线宽与50x50的线宽大不相同)。
我需要将框架取出并设置为特定的大小。例如:
shape.frame = CGRect(...)

由于帧是只读的,因此无法执行该操作。我尝试重写calculateAccumulatedFrame,但没有效果(请参见顶部链接)。

可以有人建议一种与SKShapeNode相同功能的替代方法,而不是半路出家...或者一种实际改变框架的方法。我需要的基本功能是创建一个弧形(在顶部链接的图片中可见),并将其放在某种SKNode中,以便我可以像使用SKSpriteNode一样调整大小、缩小等。


两个当前答案都没有指出的是,你可以替换用于SKShapeNode的CGPath。这给了你一种缩放的效果。虽然很困难,但是是可能的。没有简单的方法来解决这个问题。你需要"假装你已经成功了"。 - Confused
SKShapeNode是一个半成品的想法。它不是适当的绘图。这种情况发生在某些东西没有经过设计时。 - Confused
2个回答

4

SKShapeNode是基于Core Graphics路径(CGPath)的节点

因此,没有直接的方法可以进行不同于缩放的调整大小。

例如,如果您使用SKSpriteNode,则可以使用resizeByWidthresizeToWidth等操作。

但对于形状之类的节点,您应该考虑使用以下方法调整CGPathUIBezierPath的大小like

apply(_ transform: CGAffineTransform)

或者直接通过重建您的路径,例如:
let π:CGFloat = CGFloat(M_PI)
let startAngle: CGFloat = 3 * π / 4
let endAngle: CGFloat = π / 4
myShape.path = UIBezierPath(arcCenter: CGPoint.zero, radius: 33.5, startAngle: startAngle, endAngle: endAngle, clockwise: true).cgPath

这有助于解释一些问题,谢谢。但我无法使用SKSpriteNode,因为我需要编辑lineWidth,而当我将形状转换为纹理再到精灵时,我将无法修改线宽。也许我可以重新构建路径...但是你知道我可以如何动画重建路径吗?例如,我有一个半径为200的圆,如果我想用20的半径制作相同的圆,能否让它看起来像缩小的动画? - ngngngn
你可以通过淡入淡出(和删除)最老的路径来构建各种路径(如循环),直到达到你的半径(中间路径),但我不知道最终结果会是什么样子,但你可以尝试这种方式。 - Alessandro Ornano

-2
我建议将SKShapeNode转换为SKSpriteNode,因为SKShapeNode存在一些错误。
let node = SKNode()
node.addChild(shapeNode) //we do this because of the bugs with SKShapeNode
let texture = view.textureFromNode(node, crop:node.calculateAccumulatedFrame)

let spriteNode = SKSpriteNode(texture:texture)

如果可以的话,我会查找将此纹理保存到磁盘的方法,这样您就不必每次都渲染形状。


为什么要对这个答案进行负投票?已经过去了2年半,这些错误仍然存在。这是节省大量资源的好方法,原始帖子实际上想让他的SKShapeNode成为SKSpriteNode lol。即使他对Alessandro的评论我从未见过,也可以通过将skshapenode渲染到新的线宽并保存新纹理来处理。 - Knight0fDragon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接