在UIKit和SpriteKit之间转换CGPoints:SKNodes旁边的UIViews

时间:2017-07-08 17:15:34

标签: ios swift sprite-kit

有很多帖子,但无论出于何种原因,我似乎无法正确地获得正确的转换顺序。我正试图让UISliders直接进入SKLabels。

正如您在图片中看到的那样,其中一个滑块根本没有显示,而另一个滑块位于完全错误的位置(音量滑块靠近搜索标签):

enter image description here

这是我目前尝试做到这一点的尝试,尽管我尝试了一些让我无处可寻的其他配置:

class GameScene: SKScene {

  let seekSlider = UISlider(frame: CGRect(x: 0, y: 0, width: 200, height: 15))
  let volSlider  = UISlider(frame: CGRect(x: 0, y: 0, width: 200, height: 15))

  override func didMove(to view: SKView) {
    removeAllChildren() // Delete this in your actual project.

    // Add some labels:
    let seekLabel = SKLabelNode(text: "Seek")
    seekLabel.setScale(3)
    seekLabel.verticalAlignmentMode = .center
    seekLabel.position = CGPoint(x: frame.minX + seekLabel.frame.width/2,
                                 y: frame.maxY - seekLabel.frame.height)

    let volLabel  = SKLabelNode(text: "Volume")
    volLabel.setScale(3)
    volLabel.verticalAlignmentMode = .center
    volLabel.position = CGPoint(x: frame.minX + volLabel.frame.width/2,
                                y: frame.minY + volLabel.frame.height + volSlider.frame.height)

    /*  CONVERSION WOES BELOW: */

    // Configure sliders:
    let seekOrigin = convertPoint(toView: convert(seekLabel.position, from: self))
    seekSlider.frame = CGRect(origin: seekOrigin, size: CGSize(width: 200, height: 15))
    seekSlider.value = 1

    let volOrigin = convertPoint(fromView: CGPoint(x: volLabel.frame.minX, y: volLabel.frame.minY))
    seekSlider.frame = CGRect(origin: volOrigin, size: CGSize(width: 200, height: 15))
    seekSlider.value = 0

    // Scene stuff:
    view.addSubview(seekSlider)
    view.addSubview(volSlider)
    addChild(seekLabel)
    addChild(volLabel)
  }
}

1 个答案:

答案 0 :(得分:3)

你非常接近!您的代码中存在两个小问题:

问题#1

您修改seekSlider的框架两次,而不是修改seekSlider,然后修改volSlider

let volOrigin = convertPoint(fromView: CGPoint(x: volLabel.frame.minX, y: volLabel.frame.minY))
seekSlider.frame = CGRect(origin: volOrigin, size: CGSize(width: 200, height: 15))
seekSlider.value = 0

应该是

let volOrigin = convertPoint(fromView: CGPoint(x: volLabel.frame.minX, y: volLabel.frame.minY))
volSlider.frame = CGRect(origin: volOrigin, size: CGSize(width: 200, height: 15))
volSlider.value = 0

问题#2

转换代码不正确。

convertPoint(toView方法与节点position一起使用应该可以解决问题:

let seekOrigin = convertPoint(toView: seekLabel.position)

最终代码:

class GameScene: SKScene {

    let seekSlider = UISlider(frame: CGRect(x: 0, y: 0, width: 200, height: 15))
    let volSlider  = UISlider(frame: CGRect(x: 0, y: 0, width: 200, height: 15))

    override func didMove(to view: SKView) {
        removeAllChildren() // Delete this in your actual project.

        // Add some labels:
        let seekLabel = SKLabelNode(text: "Seek")
        seekLabel.setScale(3)
        seekLabel.verticalAlignmentMode = .center
        seekLabel.position = CGPoint(x: frame.minX + seekLabel.frame.width/2,
                                     y: frame.maxY - seekLabel.frame.height)

        let volLabel  = SKLabelNode(text: "Volume")
        volLabel.setScale(3)
        volLabel.verticalAlignmentMode = .center
        volLabel.position = CGPoint(x: frame.minX + volLabel.frame.width/2,
                                    y: frame.minY + volLabel.frame.height + volSlider.frame.height)

        // Configure sliders:
        let seekOrigin = convertPoint(toView: seekLabel.position)
        let offsetSeekOrigin = CGPoint(x: seekOrigin.x, y: seekOrigin.y + 50)
        seekSlider.frame = CGRect(origin: offsetSeekOrigin, size: CGSize(width: 200, height: 15))
        seekSlider.value = 1

        let volOrigin = convertPoint(toView: volLabel.position)
        let offsetVolOrigin = CGPoint(x: volOrigin.x, y: volOrigin.y - 50)
        volSlider.frame = CGRect(origin: offsetVolOrigin, size: CGSize(width: 200, height: 15))
        volSlider.value = 0

        // Scene stuff:
        view.addSubview(seekSlider)
        view.addSubview(volSlider)
        addChild(seekLabel)
        addChild(volLabel)
    }
}

最终结果:

screenshot of sliders