将捏合手势方法的缩放限制为屏幕高度

时间:2015-05-29 18:24:48

标签: swift uipinchgesturerecognizer

我有两个背景图片: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

        }

    }

}

1 个答案:

答案 0 :(得分:1)

该问题的评论中讨论的答案是缩放精灵节点本身,而不是其父SKNode。由于SKNode没有任何视觉内容(请参阅&#34;节点特征&#34;)SKNode frame属性的Apple's discussion。 ,其帧大小为(width: 0, height: 0)。请注意,如果SKNode中的所有可视节点都需要边界矩形,则calculateAccumulatedFrame()方法可用。