Неправильный кадр NSTableView в NSSplitView - PullRequest
0 голосов
/ 28 июня 2010

В моем приложении Mac я настроил два NSSplitView для создания интерфейса в стиле Mail (первый ScrollView использовался для создания вертикального разделителя, а второй - внутри первого для создания горизонтального разделителя). Чтобы проиллюстрировать интерфейс, я создал следующую диаграмму:

альтернативный текст http://img96.imageshack.us/img96/1091/setupn.png

Чтобы проиллюстрировать настройку, вот аннотированный снимок моей иерархии представлений:

альтернативный текст http://img714.imageshack.us/img714/8153/yayaj.png

Проблема, с которой я столкнулся, заключается в том, что при попытке получить кадры двух NSTableView, размещенных в частях B и C моего NSSplitView, я получаю относительные координаты. Вот код, который я использую:

NSRect aTableViewFrame = [aTableView frame];
NSRect bTableViewFrame = [bTableView frame];
NSLog(@"%@ %@", NSStringFromRect(aTableViewFrame), NSStringFromRect(aTableViewFrame));

Вот вывод, который я вижу:

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

Как видно из возвращенных значений NSRect, мне даны правильная ширина и высота NSTableView, но на самом деле мне нужно их положение относительно родительского NSSplitView. Конечно, я мог бы использовать (несколько) IBOutlets и сам построить правильное значение прямоугольника, но что я действительно ищу, так это простой способ получить кадр NSTableViews относительно родительского NSSplitView или содержащего Window.

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Если у вас есть разделенное изображение или вы можете получить его, настроив розетку, вы можете использовать convertRect:fromView:. Или, чтобы получить относительные к окну координаты, вы можете использовать convertRectToBase:. Помните, что фрейм таблицы будет относительно ее суперпредставления, поэтому вы должны использовать что-то вроде [[bTableView superView] convertRectToBase: bTableViewFrame].

1 голос
/ 28 июня 2010

Причина, по которой вы получаете эти значения, заключается в том, что NSTableViews не являются прямыми подпредставлениями NSSplitView. Во-первых, NSTableView на самом деле заключен в NSScrollView, и, согласно скриншоту вашего IB, он, в свою очередь, заключен в другой простой NSView («Пользовательский вид», который вы видите на схеме).

Если бы это был я, я бы либо пошел путем простого выхода к прямым подпредставлениям разделенного представления, либо получил бы к ним доступ, просто вызвав -subviews в разделенном представлении, вместо того, чтобы пытаться перейти вверх по иерархии вид таблицы. По моему мнению, любой из этих вариантов выглядит менее хрупким, чем работа вверх из табличного представления.

Однако, если вы хотите перейти от табличного представления к подпредставлению разделенного представления, это должно сработать:

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