-->

一个NSView的NSPopover内:转换坐标(NSView inside an NSPopove

2019-10-19 05:57发布

上下文

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我看来,在屏幕边框的坐标?

笔记:

  1. 该NSPopover IS屏幕上可见。
  2. 其框架我试图转换到屏幕坐标不是NSPopover或其内容查看直接子视图的视图。 有问题的观点实际上是一个NSClipView内的NSScrollView内的NSTableCellView内自定义的NSView一个NSTableView内。 该clipView是NSPopover的内容查看的直接子视图。
  3. 在一个正常的NSWindow,你可以采取任何子视图,并调用[self window] ,以获得含有NSWindow对象。 这样做,在一个酥料饼,然而,返回nil。

Answer 1:

下面的代码假定,您有

  • 管理该酥料饼视图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:被调用,表格单元视图已经具有可被用于执行坐标转换的窗口。



Answer 2:

你的计算屏幕坐标的做法是正确的(只是不要忘了转换视图的框架坐标窗口的基础坐标首先使用convertRect:self.frame toView:nil )。

问题是,不创建窗口,直到显示酥料饼。 在此之前,有没有办法找到视图的屏幕坐标,因为它不是在屏幕上。

如果等待显示是太晚了你,抓popoverWillShow:委托方法(或相应的通知),其时已经被创建的窗口和定位显示酥料饼的权利之前触发。



文章来源: NSView inside an NSPopover: Converting Coordinates