【发布时间】:2015-05-30 13:31:16
【问题描述】:
我有两个背景图片:background.png (1920 x 1280) 和 background@2x.png (3840 x 2560)。此外,应用只能在横向模式下运行。
在运行时,我的背景图像的大小已达到最大值。
问题:我尝试使用捏合手势方法将背景图像的高度和尺寸打印到控制台,但在每次打印时,这两个值都保持在 4001.999.. x 2668.0,尽管背景图像的大小确实如此在捏入和拉出时调整大小。
我想要完成的是:访问包含我的背景图像的 SKSpriteNode 的宽度和高度,以便我可以检查它的高度是否等于屏幕的高度。如果是,它会禁用进一步放大的捏合手势的效果。我也想管理相同的效果,但要缩小。
如果有人可以提出更好的算法来执行此操作,请随时分享。谢谢!!
这是我的代码:
// Background
backgroundNode = createBackground()
self.addChild(backgroundNode)
println("anchorPoint = \(self.anchorPoint)")
}
override func didMoveToView(view: SKView) {
let pinchRecognizer = UIPinchGestureRecognizer(target: self, action: Selector("pinchView:"))
pinchRecognizer.delegate = self
view.addGestureRecognizer(pinchRecognizer)
}
// NODES
func createBackground() -> SKNode {
let backgroundNode = SKNode()
let node = SKSpriteNode(imageNamed: "background/background")
node.name = "bg"
node.setScale(scaleFactor)
backgroundNode.addChild(node)
return backgroundNode
}
// GESTURES
func pinchView(sender: UIPinchGestureRecognizer) {
let minScale: CGFloat = 0.15
let maxScale: CGFloat = 3
let tempScale = backgroundNode.xScale * sender.scale
let pinch: SKAction = SKAction.scaleBy(sender.scale, duration: 0.0)
if tempScale > minScale && tempScale < maxScale {
backgroundNode.runAction(pinch)
sender.scale = 1.0
}
var width = backgroundNode.childNodeWithName("bg")?.self.frame.size.width
var height = backgroundNode.childNodeWithName("bg")?.self.frame.size.height
println("width: \(width)") // 4001.999...
println("height: \(height)") // 2668.0
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
if touches.count == 1 {
for touch: AnyObject in touches {
let prevLoc: CGPoint = touch.previousLocationInView(view)
let curentLoc: CGPoint = touch.locationInView(view)
let deltaX: CGFloat = curentLoc.x - prevLoc.x
let deltaY: CGFloat = curentLoc.y - prevLoc.y
backgroundNode.position.x += deltaX
backgroundNode.position.y -= deltaY
}
}
}
【问题讨论】:
-
如果我理解正确,你会得到缩放效果,但精灵节点的大小没有改变。这似乎是因为您正在缩放精灵的父节点而不是精灵本身。
-
是的,我正在尝试缩放背景图像。如果我将 pinchView 方法中的宽度和高度更改为:var width = backgroundNode.frame.size.width, var height = backgroundNode.frame.size.height,每次打印的结果都是 0.0。我对此感到非常困惑。我有一个 SKNode backgroundNode,其中包含具有图像“背景”的 SKSpriteNode 节点。为什么这些值如此偏离?
-
查看 SKNode 文档中的“节点特性”以了解节点框架的讨论。您的背景节点本身没有任何可视内容,因此其帧大小将保持为 (0, 0)(另请参见 calculateAccumulatedFrame)。有内容的是精灵;尝试缩放它,看看它的大小是否没有相应更新。
-
@kevinOwens 感谢您的帮助。我假设如果我缩放父节点,子节点的宽度和高度也会改变。我已经修复了它,现在工作得更好了。 :)
-
不客气……我通过自己的反复试验学到了一些东西。
标签: swift uipinchgesturerecognizer