Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSSplitView中的NSTableView帧不正确_Cocoa_Macos_Positioning_Frame_Nssplitview - Fatal编程技术网

Cocoa NSSplitView中的NSTableView帧不正确

Cocoa NSSplitView中的NSTableView帧不正确,cocoa,macos,positioning,frame,nssplitview,Cocoa,Macos,Positioning,Frame,Nssplitview,在我的Mac应用程序中,我设置了两个NSSplitView来创建邮件样式界面(第一个ScrollView用于创建垂直分隔符,第二个嵌套在第一个中,用于创建水平分隔符)。为了说明接口,我创建了以下图表: 为了进一步说明设置,下面是“我的视图”层次结构的注释快照: 我遇到的问题是,在尝试获取NSSplitView的B部分和C部分中托管的两个NSTableView的帧时,我收到了相对坐标。以下是我使用的代码: NSRect aTableViewFrame = [aTableView frame];

在我的Mac应用程序中,我设置了两个NSSplitView来创建邮件样式界面(第一个ScrollView用于创建垂直分隔符,第二个嵌套在第一个中,用于创建水平分隔符)。为了说明接口,我创建了以下图表:

为了进一步说明设置,下面是“我的视图”层次结构的注释快照:

我遇到的问题是,在尝试获取NSSplitView的B部分和C部分中托管的两个NSTableView的帧时,我收到了相对坐标。以下是我使用的代码:

NSRect aTableViewFrame = [aTableView frame];
NSRect bTableViewFrame = [bTableView frame];
NSLog(@"%@ %@", NSStringFromRect(aTableViewFrame), NSStringFromRect(aTableViewFrame));
以下是我看到的输出:

{{0, 0}, {760, 143}} {{0, 0}, {760, 392}}

正如您从返回的NSRect值中所看到的,我得到了NSTableView的正确宽度和高度,但我真正想要的是它们相对于父NSSplitView的位置。当然,我可以使用(许多)IBoutlet并自己构造正确的rect值,但是我真正想要的是一种简单的方法来获取NStableView相对于父NSSplitView或包含窗口的框架。

获取这些值的原因是,NStableView不是NSSplitView的直接子视图。首先,NSTableView实际上包含在NSScrollView中,根据您的IB屏幕截图,NSTableView又包含在另一个普通NSView中(您在这里的大纲中看到的“自定义视图”)

如果是我,我会选择只创建一个到拆分视图的直接子视图的出口,或者只通过调用拆分视图上的-subview来访问它们,而不是尝试从表视图向上导航层次结构。在我看来,这两种选择中的任何一种似乎都不如从表视图向上工作那么脆弱

但是,如果要从表视图转到拆分视图的子视图,则应执行以下操作:

NSRect aTableViewFrame = [[[aTableView enclosingScrollView] superview] frame];

如果您有拆分视图,或者通过设置插座获得它,您可以使用
convertRect:fromView:
。或者,要获取窗口相对坐标,可以使用
convertRectToBase:
。请记住,表的框架将与其superview相对,因此您可以使用类似于
[[bTableView superview]convertRectToBase:bTableViewFrame]

+1的
convertRect:…
方法来实现这一点