2013-03-12 2 views
5

Я пытаюсь создать NSTableView внутри NSScrollView (стандартная конфигурация, то есть) в коде, используя автоматическую компоновку. Я не могу понять, как это сделать.Рамка NSTableView внутри NSClipView/NSScrollView с использованием автоматического макета

Вот мой loadView:

- (void)loadView 
{ 
    NSView *view = [[NSView alloc] init]; 

    NSScrollView *tableScroll = [[NSScrollView alloc] init]; 
    NSTableView *fileTable = [[NSTableView alloc] init]; 
    [tableScroll setDocumentView:fileTable]; 
    [tableScroll setHasVerticalScroller:YES]; 
    [tableScroll setHasHorizontalScroller:NO]; 
    fileTable.delegate = self; 
    fileTable.dataSource = self; 
    [fileTable setHeaderView:nil]; 
    [fileTable setAllowsColumnReordering:NO]; 

    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column1"]; 
    [fileTable addTableColumn:column]; 

    [tableScroll setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [fileTable setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [view addSubview:tableScroll]; 

    NSDictionary *topViews = NSDictionaryOfVariableBindings(tableScroll); 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableScroll]|" options:0 metrics:nil views:topViews]]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[tableScroll]|" options:0 metrics:nil views:topViews]]; 

    self.fileTable = fileTable; 

    self.view = view; 
} 

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

В поисках ограничений, которые я получаю, NSScrollView получает ограничения, которые задают просмотр клипа для его заполнения, просмотр клипа вообще не имеет ограничений, а в представлении таблицы есть куча ограничений, связанных с NSTableRowViews внутри него.

Если я добавлю ограничение, подобное |[fileTable(>=500)], то я получу 500 пикселов NSTableView, но, очевидно, я не хочу этого делать.

+0

Если я установил маску для маскировки для 'tableScroll', вызовите' setTranslatesAutoresizingMaskIntoConstraints: YES' на 'tableScroll' и' fileTable' и удалим два вызова 'addConstraints', он работает нормально, и я вижу' NSAutoresizingMaskLayoutConstraint' в виде клипа, который укажите точный размер 'fileTable'. –

ответ

1

Несмотря на то, что в комментариях к этому вопросу был добавлен плакат, я подумал, что отвечу здесь (столкнувшись с тем же вопросом). Если вы используете автоматическую компоновку, вы обычно снимите флажок «Переводит маску в ограничения» в xib. Тем не менее, для таких классов, как NSScrollView и NSTableView, вы должны, как правило, разрешить им управлять своими собственными внутренними представлениями, установив их свойство translatesAutoresizingMaskIntoConstraints на YES. По-прежнему можно установить ограничения, которые являются внешними для этих видов, то есть для изменения размера по отношению к их супервизору.

Если вы установили translatesAutoresizingMaskIntoConstraints в NO, вам необходимо предоставить ограничения для всех внутренних представлений, которые, если вам не требуется специальное поведение (почти никогда), вы не захотите делать. Это была конкретная проблема выше.

Очевидным побочным эффектом неправильного его установки является то, что таблица (например) не будет правильно прокручиваться за пределы видимого в представлении.

Смежные вопросы