Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UIKit和SpriteKit之间转换CGPoints:SKNodes旁边的uiview_Ios_Swift_Sprite Kit - Fatal编程技术网

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

Ios 在UIKit和SpriteKit之间转换CGPoints:SKNodes旁边的uiview,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,有很多关于这方面的帖子,但无论出于什么原因,我似乎无法获得正确的转换顺序。我正试图让UISliders直接进入标签下方 正如您在图片中所看到的,其中一个滑块根本不显示,另一个位于完全错误的位置(音量滑块位于搜索标签附近): 以下是我目前为实现这一目标所做的尝试,尽管我尝试了一些其他配置,但却一事无成: class GameScene: SKScene { let seekSlider = UISlider(frame: CGRect(x: 0, y: 0, width: 200, hei

有很多关于这方面的帖子,但无论出于什么原因,我似乎无法获得正确的转换顺序。我正试图让UISliders直接进入标签下方

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

以下是我目前为实现这一目标所做的尝试,尽管我尝试了一些其他配置,但却一事无成:

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

您可以修改
搜索滑块
的帧两次,而不是先修改
搜索滑块
,然后再修改
滚动滑块

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
方法与节点的
位置一起使用应该可以实现以下功能:

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)
    }
}
最终结果:

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

你想实现什么布局?滑块应该在每个标签下面吗?@nathan是的,尽管此时让滑块靠近正确的标签将是一个好的开始:]见鬼,我甚至认为两个滑块都在该死的屏幕上是一个很好的答案:DNo问题,我正在研究解决方案。我很快会发布答案。谢谢!!我可以你详细说明了#1,尽管我不明白。我刚刚更新了我的答案。你可能复制/粘贴了一些代码,但忘记了更新变量名。你还需要转换标签高度,因为标签高度基于场景点而不是视点。基本上,场景中10个点的高度可能最终在viewbt上变成12个点w、 第二期在技术上没有什么问题,他正在从场景坐标转换到场景坐标,这会得到场景坐标。如果你的节点是子节点,你需要这样做