在视图坐标系之间转换点

Converting points between view coordinate systems

出于某种原因,我很难理解 convert(_:to:)convert(_:from:) 之间的区别。

假设我有两个视图(superViewsubview)和一个根视图:

let superView = UIView(frame: CGRect(origin: .init(x: 25, y: 25), size: CGSize(width: 100, height: 100)))
rootView.addSubview(view)

let subview = UIView(frame: CGRect(origin: .init(x: 25, y: 25), size: .init(width: 50, height: 50)))
superView.addSubview(subview)

convert(_:to:)根据documentation:

将点从接收者的坐标系转换到指定视图的坐标系
let convertToWindow = subview.convert(subview.bounds, to: window)
// {x 50 y 50 w 50 h 50 }

convert(_:from:) 根据 documentation:

将一个点从给定视图的坐标系转换为接收者的坐标系
let convertFromWindow = subview.convert(subview.bounds, from: window)
// {x -50 y -50 w 50 h 50 }

在这种情况下是“接收者”subview吗?如果是这样,我想我有点理解 convert(_:from:)subview 的坐标相对于自己的坐标(而不是其超视图)转换为 window 内的位置为什么它会从 {x 0 y 0 w 50 h 50 } 变为 {x 50 y 50 w 50 h 50 }

但是,convert(_:from:)在转换已经使用subview坐标系的subviews.bound时在做什么?为什么 subview.convert(subview.bounds, from: window) return {x 0 y 0 w 50 h 50 }?

最后,如果 convert 方法只是将一个点或一个绑定与视图进行转换,为什么该方法所属的实例会影响转换结果?例如,subview.convert(subview.bounds, to: window)superView.convert(subview.bounds, to: window) 产生不同的结果。

“接收方”确实是您进行调用的对象。

方法名应该从这个“接受者”的角度来理解:

  • 'to'-方法:来自接收方,当作为参数给出的视图时,矩形是什么。

  • 'from'-方法:朝向接收者,当来自作为参数给出的视图时,矩形是什么。

换句话说:

  • 使用 'to' 方法,您可以 另一个视图。
  • 使用 'from'-方法,您可以从 另一个视图返回。

尝试将其形象化为在接收器视图和参数视图之间移动。您(即接收者)可以 ,然后从 返回参数视图。

希望对您有所帮助。

是的,在像 subview.convert... 这样的表达式中,我们称 subview 为“接收者”——它是 convert 消息发送到的对象,所以它 收到该消息。

Why doesn't subview.convert(subview.bounds, from: window) return {x 0 y 0 w 50 h 50 }?

您在这里犯的心理错误是您认为 subview.bounds 以某种方式将此值固定为 subview。它没有。第一个参数只是一些数字convert 方法不知道你从哪里得到这些数字。这就是为什么你必须 告诉 你从哪里得到它们的原因 — 使用第二个参数:

  • 如果你说 from:,你是在说,“我从第二个参数的坐标系中得到这些数字”。

  • 如果你说 to:,你是在说,“我从接收器的坐标系中得到这些数字”。

why does the instance the method belongs to make a difference in the result of the conversion

因为那是故事中的另一个观点:

  • 如果你说 to:,你是在说,“我从 接收方的坐标系中得到这些数字 ,我希望你转换他们第二个参数的坐标系。

  • 如果你说 from:,你是在说,“我从 第二个参数的坐标系中得到这些数字 ,我希望你将它们 转换为 接收器的坐标系。"

记住,第一个参数是只是一些数字。你可以从你想要的任何地方得到它们,包括你的大脑内部,但如果你在表达式的其余部分对此撒谎,你将不会得到“正确”的答案——就像你的一些例子那样。