在复杂的视图层次结构中查找 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 中吗?
我正在使用一个名为 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 中吗?