将 UISegmentedControl 覆盖在 SKSpriteNode 上

问题描述 投票:0回答:1

我目前正在使用 Metal 创建一个带有浮动气球的游戏板;每个气球都是一个带有气球图像的 SKSpriteNode。用户触摸气球并将其拖动到第二个气球,将两个气球合并。它们的具体合并方式取决于用户的输入。我有一个 UISegmentedControl 弹出,用户选择四个响应之一并发生合并。目前,UISegmentedControl 会在游戏板的中间弹出;但是,我希望它覆盖在第一个气球的顶部。

一旦两个气球相互接触,我就尝试过这个:

bubble1.physicsBody!.velocity = CGVector(dx: 0, dy: 0) // Stopping the balloon

requestView.frame.origin.x = bubble1.position.x
requestView.frame.origin.y = bubble1.position.y

其中requestView是一个带有各种子视图(包括UISegmentedControl)的UIView(与气球具有相同的尺寸),bubble1是SKSpriteNode(气球)。 但是,当我将 requestView 添加为游戏板的子视图时,它不会覆盖在 SKSpriteNode (bubble1) 的顶部。事实上,每次我尝试时,它似乎都没有出现在相对于气泡1的位置的同一空间中。 对我可能做错了什么有什么想法吗? 谢谢!

swift metal uisegmentedcontrol
1个回答
0
投票

UIKit
使用 screen 坐标,而
Metal
使用 clip-spaced 坐标。

以下是将

UIKit
坐标转换为
Metal
的函数:

将屏幕坐标转换为 Metal 的标准化设备坐标

您需要执行相反操作才能将

Metal
转换为
UIKit
。像这样的东西:

func convertToScreenCoordinates(clipPos: CGPoint, viewSize: CGSize) -> CGPoint {
    let screenX = (clipPos.x + 1.0) * 0.5 * viewSize.width
    let screenY = (-clipPos.y + 1.0) * 0.5 * viewSize.height
    return CGPoint(x: screenX, y: screenY)

}

这也可能有帮助:NSView 和 MTL 可绘制坐标之间的转换

© www.soinside.com 2019 - 2024. All rights reserved.