首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSView在NSPopover中:转换坐标

NSView在NSPopover中:转换坐标
EN

Stack Overflow用户
提问于 2014-01-24 05:57:59
回答 2查看 1.3K关注 0票数 1

上下文

P是NSPopover,view是包含在P中的子视图的NSView。

我所需要的

我想把view的框架转换成屏幕的坐标系。通常,你会这样做:

代码语言:javascript
复制
NSRect frameRelativeToWindow = [self convertRect:self.frame relativeToView:nil]; 
[self.window convertRectToScreen:frameRelativeToWindow];

但是,由于view位于NSPopover中,因此它的window属性为0,上面的方法将返回NSZeroRect: 0、0、0、0。

那么,如果视图位于NSPopover中,如何才能在屏幕坐标中获得视图的框架?

备注:

  1. NSPopover在屏幕上是可见的。
  2. 我试图将其帧转换为屏幕坐标的视图不是NSPopover或其contentView的直接子视图。所讨论的视图实际上是NSTableCellView中的自定义NSTableCellView、NSTableView中的NSScrollView、NSClipView中的NSScrollView。clipView是NSPopover的contentView的直接子视图。
  3. 在普通的NSWindow中,您可以接受任何子视图并调用[self window]来获取包含的NSWindow对象。但是,在弹出程序中这样做,返回值为零。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-24 13:44:33

下面的代码假设您有

  • 管理popover视图的NSViewController子类
  • 视图控制器实现了NSPopoverDelegate

正如仓鼠基因所指出的那样,在展示之前,罂粟的窗户是不可用的。

当调用popoverWillShow:委托方法时,您的popover视图窗口应该是_NSPopoverWindow (而不是nil)的实例。

代码语言:javascript
复制
- (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:时,表单元格视图已经有一个窗口可用于执行坐标转换。

票数 1
EN

Stack Overflow用户

发布于 2014-01-24 06:51:22

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

问题是在显示弹出窗口之前不会创建该窗口。在此之前,无法找到视图的屏幕坐标,因为它不在屏幕上。

如果等待显示对您来说太晚了,请捕获popoverWillShow:委托方法(或相应的通知),当窗口已经创建和定位时,该方法会在显示弹出窗口之前触发。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21325479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档