上下文
让P是NSPopover,view是包含在P中的子视图的NSView。
我所需要的
我想把view的框架转换成屏幕的坐标系。通常,你会这样做:
NSRect frameRelativeToWindow = [self convertRect:self.frame relativeToView:nil];
[self.window convertRectToScreen:frameRelativeToWindow];但是,由于view位于NSPopover中,因此它的window属性为0,上面的方法将返回NSZeroRect: 0、0、0、0。
那么,如果视图位于NSPopover中,如何才能在屏幕坐标中获得视图的框架?
备注:
[self window]来获取包含的NSWindow对象。但是,在弹出程序中这样做,返回值为零。发布于 2014-01-24 13:44:33
下面的代码假设您有
NSPopoverDelegate。正如仓鼠基因所指出的那样,在展示之前,罂粟的窗户是不可用的。
当调用popoverWillShow:委托方法时,您的popover视图窗口应该是_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:时,表单元格视图已经有一个窗口可用于执行坐标转换。
发布于 2014-01-24 06:51:22
计算屏幕坐标的方法是正确的(只是不要忘记首先使用convertRect:self.frame toView:nil将视图的框架坐标转换为窗口的基本坐标)。
问题是在显示弹出窗口之前不会创建该窗口。在此之前,无法找到视图的屏幕坐标,因为它不在屏幕上。
如果等待显示对您来说太晚了,请捕获popoverWillShow:委托方法(或相应的通知),当窗口已经创建和定位时,该方法会在显示弹出窗口之前触发。
https://stackoverflow.com/questions/21325479
复制相似问题