2012-01-17 4 views
4

У меня есть следующая проблема. Существует подклассовый NSScrollView с представлением NSTableView в нем. Я добавил пользовательский фон в Scrollview в -drawRect: метод подкласса, и теперь я хотел бы добавить некоторые «заполнение» вокруг внутреннего Tableview как это:Прокладка вокруг NSTableView

example http://img.skitch.com/20120117-ktd9g5wy8u9cm37jeebjjxx61u.png

Как я могу реализовать это?

ответ

2

Наконец-то я решил проблему. Я создал NSView (назовем его documentContentView), добавил мой NSTableView как подвид этого documentContentView, то я добавил documentContentView к documentView в Scrollview в:

NSTableView *docView = (NSTableView *)self.scrollView.documentView; 
id newClipView = [[CustomClipView alloc] initWithFrame:[self.scrollView.contentView frame]]; 
[self.scrollView setContentView:(NSClipView *)newClipView]; 
[newClipView setDrawsBackground:NO]; 

NSView *documentContentView = [[NSView alloc] initWithFrame:docView.bounds]; 
docView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; 
[documentContentView addSubview:docView]; 
[self.scrollView setDocumentView:documentContentView]; 
[self.scrollView setDrawsBackground:NO]; 

я создал свой собственный NSClipView под названием CustomClipView (на основе этой статьи http://www.cocoadev.com/index.pl?CenteringInsideNSScrollView), и этот подкласс задает начало documentContentView при изменении размера окна. Я также подклассифицировал свой табличный вид, а в методе -reloadData я могу изменить размер документаContentView, когда tableview изменит его содержимое.

1

Прежде всего, не добавляйте фонов в drawRect:. Добавьте его в свой initWithFrame:, если вы подклассифицируете или измените его с помощью invoker.

Добавление прокладки очень просто: Измените frameNSTableView так, чтобы он был меньше и имел начало координат, которое не равно 0,0.

+0

Скорее всего, я не понял ответа. Я перезаписал метод -frame моего подкласса tableview: - (NSRect) frame { NSRect aFrame = [super frame]; NSRect newFrame = NSMakeRect (0, 0, aFrame.size.width + 20, aFrame.size.height + 20); новыйFrame.origin.x = -10; newFrame.origin.y = -10; return newFrame; } Это почти работает, но, к сожалению, правая сторона таблицы не видна в scrollview, и кажется, что scrollview не справляется с моими изменениями должным образом, потому что, если нижняя половина строки выходит из видимой области, правый скроллер не появляется автоматически. – vbali

+0

У меня нет времени, чтобы объяснить это подробно вам прямо сейчас, но, пожалуйста, посмотрите 'UIScrollView.contentSize', чтобы сообщить scrollView, насколько велик его контент. Кроме того, в вашем newFrame размеры должны быть -20, а не +20. Также обратите внимание, что обычно «NSTableView» прокручивает сам по себе, если это необходимо (вы можете видеть в документах, что это подкласс UIScrollView); нет необходимости обертывать его в scrollView, если вы не хотите ничего экстраординарного. – fzwo

+0

К сожалению, contentSize NSScrollView является свойством только для чтения. Я перезаписал аксессуар -contentSize моего подкласса NSScrollView и вернул frame.size его documentView, но он не работает :(Я прочитал всю документацию NSScrollView, NSTableView и NSClipView, но я до сих пор не понимаю как я мог сделать это с помощью этой простой задачи. – vbali

1

Левое и правое заполнение может быть выполнено внутри самой строки/ячейки. Для верхнего и нижнего заполнения я предлагаю добавить дополнительные строки без содержимого и не выбирать. Это не сексуально, но работал на меня.

1

Если вы ориентируетесь Mac OS 10.10 или более поздней версии, вы можете использовать

[scrollView setAutomaticallyAdjustsContentInsets:NO]; 
[scrollView setContentInsets:NSEdgeInsetsMake(top, right, bottom, left)];