在更改UISlider时更新所有视图

时间:2015-01-12 00:00:03

标签: sprite-kit uislider scenekit

您好我有一个带有精灵套件覆盖的SCNScene。我还有一个只包含UISlider的子视图。 Slider控制精灵套件覆盖中的一个SKLabel节点的值。但是,当我移动滑块时,标签不会更新。只有在触摸滑块外部时才会更新。所以我猜测SCNScene和覆盖层不会更新,而我的触摸在子视图中,只有在我触摸到主视图时才更新。我怎样才能解决这个问题?

谢谢!

我的项目很快,但如果你只知道客观,我还要感激地接受你的回答并自己翻译。

SceneKit代码:

class MyMarbleScene: UIViewController {
var scene: SCNScene!
var sceneView: SCNView!
var hud : MyMarbleSpriteKit!


var cameraNode: SCNNode!

override func viewDidLoad() {
    super.viewDidLoad()



    // create a new scene
    scene = SCNScene()
    sceneView = SCNView()
    sceneView.frame = self.view.frame
    sceneView.autoresizingMask = UIViewAutoresizing.allZeros
    sceneView.scene = scene
    sceneView.autoenablesDefaultLighting = false
    sceneView.allowsCameraControl = false
    sceneView.backgroundColor = UIColor.blackColor()

    self.view = sceneView

    cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    scene.rootNode.addChildNode(cameraNode)
    cameraNode.position = SCNVector3(x: 0, y: 20, z: 60)


    hud = MyMarbleSpriteKit(size: self.view.frame.size, game: self)
    sceneView.overlaySKScene = hud

    let frame = CGRectMake(10.0, self.view.frame.height*0.5, 180.0, 10.0)
    let slider = UISlider(frame: frame)
    slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: UIControlEvents.ValueChanged)
    slider.backgroundColor = UIColor.clearColor()
    slider.minimumValue = 1.0
    slider.maximumValue = 10.0
    slider.continuous = true
    slider.value = 5

    self.view?.addSubview(slider)


}

func sliderValueChanged(sender: UISlider) {
    var currentValue = Int(sender.value)
    println("\(currentValue)")
    self.hud.updateLabel(currentValue)
}

}

SpriteKit代码

class MyMarbleSpriteKit: SKScene {


var myScene: MyMarbleScene!


var SensLabelTwo = SKLabelNode()


override func didMoveToView(view: SKView) {

}

init(size: CGSize, game:MyMarbleScene) {
    super.init(size: size)
    myScene = game


    let SensLabel = SKLabelNode()
    SensLabel.text = "Marble Sensitivity:"
    SensLabel.fontName = "AvenirNext-HeavyIta"
    SensLabel.fontSize = 40
    SensLabel.fontColor = UIColor.whiteColor()
    SensLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Top
    SensLabel.position = CGPoint(x: 170, y: size.height-20)
    self.addChild(SensLabel)



    SensLabelTwo.text = "5"
    SensLabelTwo.fontName = "AvenirNext-HeavyIta"
    SensLabelTwo.fontSize = 60
    SensLabelTwo.fontColor = UIColor.whiteColor()
    SensLabelTwo.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Top
    SensLabelTwo.position = CGPoint(x: 100, y: size.height-80)
    self.addChild(SensLabelTwo)

}

func updateLabel(text: Int){

    println("helllo")

    SensLabelTwo.text = String(format:"%i", text)
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

1 个答案:

答案 0 :(得分:1)

2D场景在修改后不会自动刷新。 您必须先等待重新显示3D场景。当3D动画或操作正在运行或playing设置为YES时会发生这种情况。或者,您可以使用-[SCNView setNeedsDisplay]手动请求刷新。