gpt4 book ai didi

cocoa - 如何定位 NSPopover

转载 作者:行者123 更新时间:2023-12-03 16:54:45 25 4
gpt4 key购买 nike

我有一个 OSX 应用程序,它使用 NSViewController 在我的 NSView 中交换输入输出 View 。其中一个 View 是 NSOutlineView。我现在希望当用户双击大纲 View 中的一行时出现 NSPopover。目前我使用following approach让弹出窗口出现:

NSRect theRect = [[NSApp keyWindow] convertRectFromScreen: NSMakeRect(700, 400, 5, 5)];
[myPopover showRelativeToRect: theRect // Window Coordinates
ofView: [[NSApp keyWindow] contentView]
preferredEdge: NSMinYEdge];

这使得 NSPopover 出现在应用程序的底部。这可行,但我希望能够让弹出窗口恰好出现在 NSOutlineView 的单击行下方。我换入换出的每个 View 都是由 NSViewController 控制的,我认为我可以使用 NSViewController 的 view 属性来识别我的 View 位置。但是,如果我将 [[NSApp keyWindow] contentView] 替换为 myViewController.view,我会收到 View 没有窗口且 NSPopover 崩溃的错误。显然,我遇到了麻烦 1)找到 NSView 中单击的行相对于主窗口的坐标 2)理解为什么我的 View 没有窗口。如果有人提出可以帮助我理解这些问题的建议,我将不胜感激。

更新 06/02/2013我仍在努力解决我的问题,但我发现如果我通过 MainWindowController (myControlledView) 访问 View 的属性,我可以获得 View 的正确坐标。当我询问 View 的原点和帧大小时,我得到了正确的值。我的 VC 将自定义 View 加载为 NIB 文件,当我询问加载 View 的原点时,我得到 (0,0)。我认为即使我将 View 加载为 NIB, View 相对于窗口的位置也将保持不变?我可以将 View 原点传递给我的 VC,从而正确设置 NSPopover,但这看起来相当麻烦,我认为 NIB 加载的 View 原点可以通过 VC 正确访问。

managingViewController *vc = [viewControllers objectAtIndex:[viewIndex intValue]];
[self.currentViewController.view removeFromSuperview];
[self setCurrentViewController:vc];
[self.myControlledView addSubview:vc.view];
NSLog(@"My origin: %f %f",vc.view.frame.origin.x,vc.view.frame.origin.y);

这会导致:My origin: 0.000000 0.000000并且不是我正在寻找的,而这个:

NSLog(@"My origin: %f %f",self.myControlledView.frame.origin.x,self.myControlledView.frame.origin.y);

结果正确来源:我的来源:176.000000 38.000000

显然,我不明白有关 View 和窗口的一些内容。感谢任何帮助。

感谢您的建议和帮助!干杯,特隆德

最佳答案

当我明白我在做什么后,这变得非常简单。事实证明,我的 currentViewController 有两次分配。一份分配在 IB 中,一份分配在代码中。当我删除 IB 创建的 VC 时,我可以与正确的代码启动 View 进行交互,并且我能够使用(跟踪的)鼠标的位置来定位我的 NSPopover:

-(void)mouseMoved:(NSEvent *)theEvent {
NSPoint p = theEvent.locationInWindow;
self.myMouseX=[NSNumber numberWithFloat:p.x];
self.myMouseY=[NSNumber numberWithFloat:p.y];
}

鼠标位置用于定义我的矩形的坐标:

NSRect theRect = NSMakeRect([self.myMouseX floatValue] + 5,[self.myMouseY floatValue],1,1);

[myPopover showRelativeToRect: theRect // Window Coordinates
ofView: [[NSApp keyWindow] contentView]
preferredEdge: NSMaxXEdge];

干杯,特隆德

关于cocoa - 如何定位 NSPopover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com