使用这些作为指南:
我已经实现了以下功能来放大和缩小 SpriteKit 场景,以及使用两个 UIButton 逐步放大和缩小场景的能力:
var previousCameraScale = CGFloat()
var count = 0
@objc func pinchGestureAction(_ sender: UIPinchGestureRecognizer) {
guard let camera = cadScene.camera else {
return
}
if sender.state == .began {
previousCameraScale = camera.xScale
}
camera.setScale(previousCameraScale * 1 / sender.scale)
}
@IBAction func zoomIn(_ sender: Any) {
count = count+1
guard let camera = cadScene.camera else {
return
}
previousCameraScale = camera.xScale
camera.setScale(previousCameraScale / CGFloat(count))
}
@IBAction func zoomOut(_ sender: Any) {
count = count-1
guard let camera = cadScene.camera else {
return
}
previousCameraScale = camera.xScale
camera.setScale(previousCameraScale * CGFloat(count))
}
捏缩放效果很好;我在放大和缩小时遇到了麻烦,但是……出于某种原因将比例设置inf
为-inf
。
数学不是最好的;任何帮助表示赞赏!
编辑:
更新逻辑:
@IBAction func zoomIn(_ sender: Any) {
count = count+0.1
guard let camera = cadScene.camera else {
return
}
previousCameraScale = camera.xScale - CGFloat(count)
camera.setScale(previousCameraScale * 1)
print("Previous camera scale \(previousCameraScale)")
}
@IBAction func zoomOut(_ sender: Any) {
count = count-0.1
guard let camera = cadScene.camera else {
return
}
previousCameraScale = camera.xScale + CGFloat(count)
if previousCameraScale < 0 {
return
}
camera.setScale(previousCameraScale * 1)
print("Previous camera scale \(previousCameraScale)")
}
@objc func pinchGestureAction(_ sender: UIPinchGestureRecognizer) {
guard let camera = cadScene.camera else {
return
}
if sender.state == .began {
previousCameraScale = camera.xScale
}
camera.setScale(previousCameraScale * 1 / sender.scale)
print("Previous camera scale \(previousCameraScale)")
print("Sender scale \(sender.scale)")
print("Camera scale \(camera.xScale)")
}