在复杂的视图层次结构中查找 CGRect

Finding a CGRect in a complex view hierarchy

我正在使用一个名为 WSCoachMarksView 的 coachmarks/wizard 框架,它可以使整个屏幕变暗,并允许您在给定的 CGRect 中创建一个突出显示的区域来照亮号召性用语。我有一个有点复杂的视图层次结构,并且无法正确识别我想针对 parent windows.

突出显示的 CGRect

这是我的层次结构。目标是找到 Day1 的 CGRect,这是一个大约 50 像素高和 25 像素宽的图像视图。

-TabViewController
  -NavigationViewController
     -HomeViewController : ViewController
       -Container View (container within homeviewcontroller)
====================Everything below is within this container==============
         - HomeContainerViewController : ViewController (this view is loaded within the container)
           -WeekViewController: ViewController
              DayView (just a view I dragged onto WeekViewController to hold subviews)
                Day1 (this is a rectangle imageview within the above DayView)

所以在HomeViewController中有一个containerview。基于上述层次结构,我尝试了多种排列来正确突出显示 Day1,但都失败了。我认为我对 convertPoint 的理解是错误的,想寻求一些帮助来理解传递哪些参数。

我在某处读到,你只能解决 parent/child 而不是 grandparent 等之间的关系?

鉴于此:

 //assume tabViewController is the TabViewController above
 //assume weekViewController is self.view, or WeekViewController

 let day1Point = weekViewController.view.convertPoint(day1.frame.origin, fromView: tabViewController.view)

所以不幸的是,这样的东西只会突出显示屏幕 top-left 上的区域(我的第 1 天实际上靠近屏幕中间)。

convertPoint 或 convertRect 的方法是什么?是不是一直是层级树中的叶节点,"fromView"参数就是top-most视图(parent节点)?

非常感谢,任何澄清/建议将不胜感激!

编辑 所以这样的事情让我更接近:

var myFrame: CGRect = dayView.convertRect(day1.frame, toView: self.view)

但根据iPhone 5, 5s, 6, 6plus(仅显示部分图像),它仍然略有偏差。

OP 备注:

Fogmeister 在评论中建议使用 viewWillAppear,但我确定他的意思是 viewDidAppear(这实际上是导致我解决这个问题)。除此之外,他所建议的一切都是正确的(即下面 convertPoint/Rect 的正确用法)。非常感谢您的帮助!

嗯,convert 的工作方式是取绝对点并将其转换为不同的参考视图。

所以你应该可以做这样的事情...

从 WeekViewController 你应该能够做...

self.view.convertPoint(day1.frame.origin, toView:homeViewController.view)

或...

self.view.convertRect(day1.frame, toView:homeViewController.view)

您需要引用 homeViewController 才能执行此操作。不过,我不确定您要做什么。突出显示视图的代码在哪里?这段代码在 homeViewController 中吗?