由于某种原因,我很难理解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:)
在转换{em}已经使用subviews.bound
的坐标系的subview
时在做什么?为什么subview.convert(subview.bounds, from: window)
不返回{x 0 y 0 w 50 h 50 }
?
最后,如果convert
方法仅将点或边界转换为视图或从视图转换,为什么该方法所属的实例对转换结果产生影响?例如,subview.convert(subview.bounds, to: window)
和superView.convert(subview.bounds, to: window)
产生不同的结果。
答案 0 :(得分:2)
是的,在类似subview.convert...
的表达式中,我们将subview
称为“接收者”,它是convert
消息发送到的对象,因此它 receives < / em>该消息。
为什么
subview.convert(subview.bounds, from: window)
不返回{x 0 y 0 w 50 h 50 }
?
您在这里犯的精神错误是,您认为subview.bounds
以某种方式将此值固定为subview
。没有。第一个参数仅仅是一些数字。 convert
方法不知道您从哪里获得这些数字。这就是为什么您必须在第二个参数中告诉它的位置:
如果您说from:
,则是在说:“我从第二个参数的坐标系中得到了这些数字”。
如果您说to:
,则是在说:“我从接收者的坐标系中得到了这些数字”。
为什么该方法所属的实例对转换结果有影响
因为这是故事中的另一种观点:
如果您说to:
,则是在说:“我是从接收者的坐标系来的,我希望您将它们转换为第二个参数的坐标系。“
如果您说from:
,则是在说:“我从第二个参数的坐标系中获得了这些,我希望您将它们转换为< / em>接收者的坐标系。“
请记住, first 参数是一些数字。您可以从所需的任何位置(包括脑海中)获取它们,但是,如果您在表达式的其余部分中撒谎,您将不会得到“正确的”答案-如您的某些示例所做的那样。
答案 1 :(得分:1)
“接收者”确实是您进行呼叫的对象。
应该从这个“接收器”的角度来理解方法的名称:
“至”方法:来自接收器,当到作为参数给出的视图时,矩形将是什么。
'from'方法:朝向接收器,当从 作为参数给出的视图到达时,矩形将是什么。
换句话说:
尝试使其在接收器视图和参数视图之间移动时可视化。您(即接收方)可以转到,然后从参数视图返回。
我希望这会有所帮助。