【问题标题】:Converting points between view coordinate systems在视图坐标系之间转换点
【发布时间】:2021-02-20 22:08:04
【问题描述】:

由于某种原因,我很难理解 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 内的位置,这就是为什么它从@987654336 @到{x 50 y 50 w 50 h 50 }

但是,convert(_:from:) 在转换已经使用subview 坐标系的subviews.bound 时,它在做什么?为什么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) 会产生不同的结果。

【问题讨论】:

    标签: ios objective-c swift uiview


    【解决方案1】:

    “接收者”确实是您拨打电话的对象。

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

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

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

    换句话说:

    • 使用“to”方法,您可以转到另一个视图。
    • 使用“来自”方法,您可以另一个视图返回。

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

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

      • 如果您说to:,您的意思是“我从接收者的坐标系中得到这些数字”。

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-08-29
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 1970-01-01
        相关资源
        最近更新 更多