上下文
让P
是NSPopover和view
是一个的NSView是包含在一个子视图P
。
我需要的
我想利用的框架view
并将其转换为屏幕上的坐标系。 通常情况下,你会是这样做的:
NSRect frameRelativeToWindow = [self convertRect:self.frame relativeToView:nil];
[self.window convertRectToScreen:frameRelativeToWindow];
然而,由于view
处于NSPopover,其window
属性是零和上述方法将返回NSZeroRect:[0,0,0,0]
所以,我怎样才能得到,如果认为是在NSPopover我看来,在屏幕边框的坐标?
笔记:
- 该NSPopover IS屏幕上可见。
- 其框架我试图转换到屏幕坐标不是NSPopover或其内容查看直接子视图的视图。 有问题的观点实际上是一个NSClipView内的NSScrollView内的NSTableCellView内自定义的NSView一个NSTableView内。 该clipView是NSPopover的内容查看的直接子视图。
- 在一个正常的NSWindow,你可以采取任何子视图,并调用
[self window]
,以获得含有NSWindow对象。 这样做,在一个酥料饼,然而,返回nil。
下面的代码假定,您有
- 管理该酥料饼视图NSViewController子
- 视图控制器实现
NSPopoverDelegate
作为hamstergene指出,直到它显示的酥料饼的窗口将不可用。
当popoverWillShow:
委托方法被调用,你的酥料饼视图的窗口应该是一个实例_NSPopoverWindow
(不nil
)。
- (void)popoverWillShow:(NSNotification *)notification
{
NSWindow* popOverWindow = self.view.window;
NSRect popoverRectInScreenCoords = [popOverWindow convertRectToScreen:self.view.frame];
NSLog(@"Popover Rect in Screen Coords:%@", NSStringFromRect(popoverRectInScreenCoords));
}
更新
布莱恩(在OP)张贴在评论解决他的问题。
问题不NSPopover
本身。 对于实际的原因nil
他的一些子视图窗口是NSTableView
,释放不可见NSTableCellViews
。
作为一种变通方法,他实施viewDidMoveToWindow
在他的习惯NSTableCellView
子类。 当viewDidMoveToWindow:
被调用,表格单元视图已经具有可被用于执行坐标转换的窗口。
你的计算屏幕坐标的做法是正确的(只是不要忘了转换视图的框架坐标窗口的基础坐标首先使用convertRect:self.frame toView:nil
)。
问题是,不创建窗口,直到显示酥料饼。 在此之前,有没有办法找到视图的屏幕坐标,因为它不是在屏幕上。
如果等待显示是太晚了你,抓popoverWillShow:
委托方法(或相应的通知),其时已经被创建的窗口和定位显示酥料饼的权利之前触发。