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

时间:2015-02-28 14:48:07

标签: ios swift ios8 xcode6

我正在使用名为WSCoachMarksView的coachmarks /向导框架,它会使整个屏幕变暗,并允许您在给定的CGRect中创建突出显示的区域以阐明号召性用语。我有一个有点复杂的视图层次结构,并且无法正确识别我想要关注父窗口的CGRect。

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

  

-TabViewController
  -NavigationViewController
  -HomeViewController:ViewController
  -Container View(homeviewcontroller内的容器)
  ====================以下所有内容都在此容器内==============   
   -   HomeContainerViewController:ViewController(此视图在容器内加载)
  -WeekViewController:ViewController
  DayView(只是我拖到WeekViewController上以保存子视图的视图)
  Day1(这是上面DayView中的矩形图像视图)

因此HomeViewController中有一个容器视图。基于上面的层次结构,我尝试了多种排列来正确地突出显示Day1,但都失败了。我认为我对convertPoint的理解是错误的,并希望在理解要传递的参数方面寻求帮助。

我在某处读到你只能处理父母/子女之间的关系,而不是祖父母等等?

鉴于此:

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

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

所以很遗憾,这样的事情突出了屏幕左上角的区域(我的第1天实际上是在屏幕中间附近)。

convertPoint或convertRect的方法是什么?它始终是层次结构树中的叶节点,“fromView”参数是最顶层的视图(父节点)吗?

非常感谢,非常感谢任何澄清/建议!

修改 所以这样的事情让我更接近:

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

但它仍然略有不同取决于iPhone 5,5s,6,6plus(仅显示部分图像)。

1 个答案:

答案 0 :(得分:2)

OP注意:

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

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

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

从WeekViewController你应该能够......

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

...或

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

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