在视图坐标系之间转换点
Converting points between view coordinate systems
出于某种原因,我很难理解 convert(_:to:)
和 convert(_:from:)
之间的区别。
假设我有两个视图(superView
和 subview
)和一个根视图:
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:
,你是在说,“我从 第二个参数的坐标系中得到这些数字 ,我希望你将它们 转换为 接收器的坐标系。"
记住,第一个参数是只是一些数字。你可以从你想要的任何地方得到它们,包括你的大脑内部,但如果你在表达式的其余部分对此撒谎,你将不会得到“正确”的答案——就像你的一些例子那样。
出于某种原因,我很难理解 convert(_:to:)
和 convert(_:from:)
之间的区别。
假设我有两个视图(superView
和 subview
)和一个根视图:
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:
,你是在说,“我从 第二个参数的坐标系中得到这些数字 ,我希望你将它们 转换为 接收器的坐标系。"
记住,第一个参数是只是一些数字。你可以从你想要的任何地方得到它们,包括你的大脑内部,但如果你在表达式的其余部分对此撒谎,你将不会得到“正确”的答案——就像你的一些例子那样。