2015-05-05 6 views
1

У меня есть следующий код:NSScrollView начиная с середины documentView

[[ticketsListScrollView documentView] setFrame: NSMakeRect(0, 0, [ticketsListScrollView frame].size.width, 53 * [tickets count])]; 
[[ticketsListScrollView documentView] setFlipped:YES]; 


for(int i = 0; i < [tickets count]; i++) { 
    TicketsListViewController *viewController = [[TicketsListViewController alloc] initWithNibName:@"TicketsListViewController" bundle:nil]; 

    viewController.dateLabelText = tickets[i][@"date"]; 
    viewController.timeLabelText = tickets[i][@"time"]; 
    viewController.subjectLabelText = tickets[i][@"title"]; 

    NSRect frame = [[viewController view] frame]; 
    frame.origin.y = frame.size.height * i; 
    [viewController view].frame = frame; 

    [[ticketsListScrollView documentView] addSubview:[viewController view]]; 
} 

, если список достаточно (много просмотров) большой, NSScrollView начинается в верхнем левом углу, это здорово. Для менее взглядов (мнения не принимают весь documentView, то NSScrollView начинается в середине.

Любая идея, почему?

Спасибо!

+1

Пожалуйста, будьте осторожны в отношении форматирования (и публикации полного) кода - для этого вам нужно, чтобы другие работали больше, чтобы вам помочь. Я предполагаю, что вы просто забыли вставить в закрывающую фигурную скобку для своего условного условия и добавили ее, угадав, что это был конец вашего кода. Поправьте меня если я ошибаюсь. –

ответ

1

просмотров не переворачиваются по умолчанию, что означает, что ваш документ в левом нижнем углу (по умолчанию, без перевернутого представления) отображается вид прокрутки. То, что вы видите, - это вид, который не достаточно высок, чтобы подталкивать «верхний» вид в верхней части прокрутки Я вижу, что вы пытались перевернуть этот взгляд, поэтому вы уже знаете об этом, но вы делаете это неправильно.

Я не уверен, почему вы не получаете сообщение об ошибке или предупреждение при вызове -setFlipped:, поскольку свойство isFlipped доступно только для чтения. По вашему мнению документа (вид, который прокручивается, и в котором вы размещение всех эти подвидов), вы можете изменить его:

- (BOOL)isFlipped { 
    return YES; 
} 

Конечно, вы должны поместить это в пользовательском NSView подкласса и установить это как класс просмотра документа вида прокрутки в IB, если вы не создаете его во время выполнения. Вам также нужно будет отрегулировать фреймы, которые вы используете для макета, поскольку вы в настоящее время их выражаете в системе координат рамки прокрутки. Вы должны выразить их в координатах в вашем контейнере/макете с координатами, которые также будут перевернуты и, скорее всего, будут отличаться от ваших координат прокрутки. Вам также понадобится реализовать -intrinsicContentSize (и вызвать -invalidateIntrinsicContentSize при добавлении/удалении subviews), так что автоматическая компоновка может соответствующим образом определять размер контейнера.

+0

Это звучит сложно, даже если мне нужен только список представлений внутри прокрутки (например, таблица с одним столбцом, но без проблем с «NSTableView'). – MariusP

+1

Если все ваши подвидности имеют одинаковые размеры, представление таблицы на основе представления абсолютно проще. Если, однако, ваши взгляды имеют разную высоту (особенно на основе различной ширины), вы, вероятно, найдете свой нынешний подход более простым. Перевернутые координаты на самом деле не так сложны, хотя это звучит. Еще раз взгляните на пояснения руководства по рисованию какао для систем координат взглядов и «перевернутости» для обновления. Это всего лишь небольшая корректировка начала/прогрессии y в вашем коде. –