在更改 UISlider 时更新所有视图

Update all views while UISlider is being changed

你好,我有一个 SCNScene,上面有精灵工具包覆盖。我还有一个仅包含 UISlider 的子视图。 Slider 控制 sprite 工具包叠加层中的一个 SKLabel 节点的值。但是,当我移动滑块时,标签不会更新。它只会在我触摸滑块外部时更新。所以我猜测当我在子视图中进行触摸时,SCNScene 和叠加层不会更新,并且只会在我返回主视图时更新。我怎样才能解决这个问题?

谢谢!

我的项目在swift,但如果你只知道objective-c我还是感激地采纳你的答案并自己翻译。

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")
}

}

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

手动请求刷新