在视图坐标系之间转换点

Kev*_*vvv 1 objective-c uiview ios swift

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

\n

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

\n
let superView = UIView(frame: CGRect(origin: .init(x: 25, y: 25), size: CGSize(width: 100, height: 100)))\nrootView.addSubview(view)\n\nlet subview = UIView(frame: CGRect(origin: .init(x: 25, y: 25), size: .init(width: 50, height: 50)))\nsuperView.addSubview(subview)\n
Run Code Online (Sandbox Code Playgroud)\n

convert(_:to:)根据文档,将接收器\xe2\x80\x99s 坐标系中的点转换为指定视图的

\n
let convertToWindow = subview.convert(subview.bounds, to: window)\n// {x 50 y 50 w 50 h 50 }\n
Run Code Online (Sandbox Code Playgroud)\n

convert(_:from:)根据文档,将给定视图的坐标系中的点转换为接收器的坐标系

\n
let convertFromWindow = subview.convert(subview.bounds, from: window)\n// {x -50 y -50 w 50 h 50 }\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

mat*_*att 5

是的,在像 的表达式中subview.convert...,我们将“接收者”称为\xe2\x80\x94,它是消息发送到subview的对象,因此它接收该消息。convert

\n
\n

为什么不subview.convert(subview.bounds, from: window)回来{x 0 y 0 w 50 h 50 }

\n
\n

您在这里犯的心理错误是您认为subview.bounds以某种方式将此值固定到subview. 事实并非如此。第一个参数只是一些数字。该convert方法不知道您从哪里获得这些数字。这就是为什么你必须用第二个参数告诉它你从哪里得到它们 \xe2\x80\x94 :

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

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

    \n
  • \n
\n
\n

为什么方法所属的实例会对转换结果产生影响

\n
\n

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

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

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

    \n
  • \n
\n

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

\n