UIView convertRect: - 找到子视图位置两个视图深

Posted

技术标签:

【中文标题】UIView convertRect: - 找到子视图位置两个视图深【英文标题】:UIView convertRect: - finding subview position two views deep 【发布时间】:2016-04-11 12:40:51 【问题描述】:

在下面的图片中,每个矩形都是一个 UIView。视图 A 对视图 C 有弱引用。视图 A 创建视图 D 并需要将其作为子视图添加到视图 C 以便完全覆盖视图 A。因此,我需要获取视图 A 相对于视图 C 的位置。在 0,0 处添加视图 D 作为视图 A 的子视图不是这种特殊情况的选项 - 它必须是 C 的子视图。

查看层次结构起点

查看层次结构目标点

我已经尝试了convertRect:toView:convertRect:fromView:我能想到的所有组合,将三个视图的组合作为发送者和接收者以及使用它们的子视图,但是组合太多,我只能'不明白它是如何工作的。如果有人可以首先发布正确的语法,我将非常感激,这样我就可以让它工作,更重要的是,我可以通过一个工作示例来了解该函数实际上在做什么。

非常感谢!

【问题讨论】:

【参考方案1】:

convertRect: 是正确的方法:

let viewD = UIView()
viewD.frame = viewA.viewC.convertRect(viewA.frame, fromView: viewA.superview!)
viewA.viewC.addSubview(viewD)

在 Objective-C 中:

UIView *viewD = [[UIView alloc] init];
viewD.frame = [viewA.viewC convertRect:viewA.frame fromView:viewA.superview];
[viewA.viewC addSubview:viewD];

【讨论】:

感谢您的快速回复!我不太了解 Swift 中 this 的语法……你知道 Objective C 的等价物吗?编辑 - 会不会是 viewD.frame = [self.viewC convertRect:self.frame fromView:self.superview];(从 viewA 上的实例方法调用) 啊哈!原来我是个白痴!根据我上面的评论,当转换为 Objective C 时,您的 swift 示例运行良好,但似乎没有首先工作,因为我在将 ViewA 添加到 ViewB 之前进行了转换,因此它的超级视图为零,因此返回 CGRectZero 作为它的框架在转换过程中。我在 ViewA 添加到视图层次结构之后移动了那行代码,它运行良好。非常感谢!

以上是关于UIView convertRect: - 找到子视图位置两个视图深的主要内容,如果未能解决你的问题,请参考以下文章

OC convertRect

iOS convertRect:view.frame toView: x 异常翻倍?

convertRect:toView 不返回预期的窗口坐标

convertRect 获取超级视图中的相对位置

在 UIScrollview 中的 UIView 上的屏幕中的框架

了解 convertRect:toView:、convertRect:FromView:、convertPoint:toView: 和 convertPoint:fromView: 方法