这个数学不是特定于平台的,我会 Select 任何语言作为答案.这很难解释我为什么要这么做,但我会try 包括图片.

我有一个视图(视图a),它将 map 作为容器覆盖.这样做的目的是在用户拖动 map 时,包含我们的内容,同时保持固定在 map 上.该视图有一个坐标系,其原点位于屏幕左上角.这将是我们的绝对坐标系,我们试图在这里转换位置.

UIView coordinate system

接下来,我们将在视图a和屏幕上可见内容的交点处形成一个矩形.在我看来,我通过以下特性实现了这一点:

    var visibleRect: CGRect {
        guard let superview = self.superview?.superview else {
            return CGRect(x: 0, y: 0, width: 0, height: 0)
        }
        // Convert the superview's coordinate system to the current view's coordinate system and find the intersecting rectangle. This is so we don't have to render excessive particles.
        let val = self.bounds.intersection(
            self.convert(superview.frame, from: superview)
        )
        return val
    }

这将返回一个相对于视图A原点的矩形.这个矩形的目的是金属视图不能太大,因此我将金属视图限制为仅在可见范围内绘制,同时保持金属视图相对于视图A绘制位置的精确坐标.

100

下面是我一直想说的:金属顶点函数有一个中心坐标系,在整个宽度和高度范围内从-11,如下图所示(除了我只在二维空间中使用它,所以忽略z位置):

center coordinate system

现在我的问题是:

如果我在金属视图的左上象限找到一个点(-0.002,0.5),我将如何利用给定的信息找到它在视图a中的位置?我如何将点在视图中的位置返回到金属视图,以说明相对定位的矩形?


视力的

下面是一个希望澄清的视觉效果:

example coordinate system

编辑

如果金属视图占据了视图A的整个范围,我可以通过以下文本代码将视图A转换为金属视图:

def normalizedToViewA(x, y):
    x *=  1.0
    y *= -1.0
    x +=  1.0
    y +=  1.0
    return ((x / 2.0) * width, (y / 2.0) * height)

def viewAToNormalized(x, y):
    normalizedX = x / (width / 2.0)
    normalizedY = y / (height / 2.0)
    normalizedX -=  1.0
    normalizedY -=  1.0
    normalizedX *=  1.0
    normalizedY *= -1.0
    return (normalizedX, normalizedY)

但现在我需要计算,就好像金属视图填充了矩形,而矩形只是视图a的一部分.

推荐答案

我找到了答案,并使用Python实现了易读性.

视图A为1270*680.

# View A (Top Left Origin)
width = 1270
height = 680

# Visible Rectangle (Top Left Origin)
#   with an origin as a position in View A
subOriginX = 1000
subOriginY = 400
subWidth = 20
subHeight = 20

# Centered origin converted to top left origin
#   where origin is (0,0)
def normalizedToSubview(x, y):
    x *=  1.0
    y *= -1.0
    x +=  1.0
    y +=  1.0
    return ((x / 2.0) * subWidth, (y / 2.0) * subHeight)

# Top Left origin to centered origin
def subviewToNormalized(x, y):
    normalizedX = x / (subWidth / 2.0)
    normalizedY = y / (subHeight / 2.0)
    normalizedX -=  1.0
    normalizedY -=  1.0
    normalizedX *=  1.0
    normalizedY *= -1.0
    return (normalizedX, normalizedY)

# Relative position of a point within subview
#   but on View A's plane
def subviewToViewA(x, y):
    return (x + subOriginX, y + subOriginY)


# Relative position of a point within View A
#   but on the subview's plane
def viewAToSubView(x, y):
    return (x - subOriginX, y - subOriginY)


# Position within Metal View to a position within View A
normalizedCoord = (0.0, 0.0)
toSubview = normalizedToSubview(*normalizedCoord)
viewACoord = subviewToViewA(*toSubview)

print(f"Converted {normalizedCoord} to {toSubview}")
print(f"Converted {toSubview} to {viewACoord}")
# Converted (0.0, 0.0) to (10.0, 10.0)
# Converted (10.0, 10.0) to (1010.0, 410.0)

# Position within View A to Metal View
backToSubview = viewAToSubView(*viewACoord)
backToNormalized = subviewToNormalized(*backToSubview)
# Converted (1010.0, 410.0) to (10.0, 10.0)
# Converted (10.0, 10.0) to (0.0, -0.0)

print(f"Converted {viewACoord} to {backToSubview}")
print(f"Converted {backToSubview} to {backToNormalized}")

这是一个非常利基的问题,但如果你面临类似的问题,请发表 comments ,我会尽我所能扩大.

Ios相关问答推荐

自定义UIControl不适用于UITapGestureRecognizer

如何在SwiftUI中将图像整合到文本标签中间?

在 Swift 中 @MainActor 似乎被 withCheckedContinuation 而不是其他异步调用继承是巧合吗?

iOS SwiftUI - 使用 PhotosPicker 从图库中 Select 图像或视频

AppCenter 错误:/usr/bin/xcodebuild 失败,返回码:65

在视图控制器中实例化视图控制器是否可能/智能?

VStack 显示错误实例方法 'sheet(item:onDismiss:content:)' 要求 'Int' 符合 'Identifiable'

转换在 NavigationView 中不起作用

Swift 5.7 - 使存在的任何协议符合 Hashable

UIButton在iOS7中没有显示突出显示

每次运行后,Xcode 6 都会在 iOS8 模拟器中重命名我的应用程序目录.

如何找出坐标之间的距离?

iOS swift从另一个数组中删除一个数组的元素

无论我将构建版本或应用程序版本更改为什么,都会出现 ITEMS-4238冗余二进制上传错误

标题为 UIImage 的导航栏

如何获取 iTunes 连接团队 ID 和团队名称?

Xcode 10.2 无法在 iOS < 10 的模拟器上运行应用程序

Swift 中的日期到毫秒和回溯到日期

更新字段时,UITextField值已更改未触发

更改标签栏项目图像和文本 colored颜色 iOS