Помещение объекта NSTextView в NSScrollView

Текстовое представление прокрутки обычно требуется в приложениях, и Интерфейсный Разработчик предоставляет NSTextView, сконфигурированному просто с этой целью. Однако время от времени Вы, возможно, должны создать текстовое представление прокрутки программно.

Процесс состоит из трех шагов: установка NSScrollView, установка NSTextView и сборка частей. Эта статья описывает эти шаги с точки зрения типичного текстового представления, сконфигурированного с вертикальной полосой прокрутки только, затем показывает, что альтернативные операторы раньше конфигурировали горизонтальную полосу прокрутки.

Установка представления прокрутки

Принятие объекта имеет переменную theWindow это представляет окно, где представление прокрутки выведено на экран, можно установить NSScrollView с помощью кода в Перечислении 1.

Перечисление 1  , Настраивающее представление прокрутки

NSScrollView *scrollview = [[NSScrollView alloc]
            initWithFrame:[[theWindow contentView] frame]];
NSSize contentSize = [scrollview contentSize];
 
[scrollview setBorderType:NSNoBorder];
[scrollview setHasVerticalScroller:YES];
[scrollview setHasHorizontalScroller:NO];
[scrollview setAutoresizingMask:NSViewWidthSizable |
            NSViewHeightSizable];

Обратите внимание на то, что код создает NSScrollView, полностью покрывающий предметную область окна, в котором это выведено на экран. Это также указывает вертикальную полосу прокрутки, но никакая горизонтальная полоса прокрутки, начиная с этого текстового текста оберток представления прокрутки в горизонтальной степени NSTextView, но не позволяет тексту течь вне вертикальной степени NSTextView. Для использования горизонтальной полосы прокрутки необходимо сконфигурировать представление прокрутки и текстовое представление немного по-другому, как описано в Установке Горизонтальной Полосы прокрутки.

Наконец, кодовые наборы, как NSScrollView реагирует, когда окно он выведен на экран в размере изменений. Включение битов NSViewWidthSizable и NSViewHeightSizable его маски изменения размеров гарантирует, что NSScrollView растет и уменьшается для соответствия размерностей окна.

Установка текстового представления

Следующий шаг должен создать и сконфигурировать NSTextView для помещений в NSScrollView. Перечисление 2 показывает операторы, выполняющие этот шаг.

Перечисление 2  , Настраивающее текстовое представление

theTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0,
            contentSize.width, contentSize.height)];
[theTextView setMinSize:NSMakeSize(0.0, contentSize.height)];
[theTextView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[theTextView setVerticallyResizable:YES];
[theTextView setHorizontallyResizable:NO];
[theTextView setAutoresizingMask:NSViewWidthSizable];
 
[[theTextView textContainer]
            setContainerSize:NSMakeSize(contentSize.width, FLT_MAX)];
[[theTextView textContainer] setWidthTracksTextView:YES];

Перечисление 2 указывает, что ширина и высота NSTextView первоначально соответствуют те из предметной области NSScrollView. setMinSize: сообщение говорит NSTextView, что может стать произвольно маленьким по ширине, но не меньшим, чем его начальная высота. setMaxSize: сообщение позволяет получателю расти произвольно в любой размерности. Эти пределы используются NSLayoutManager, когда он изменяет размеры NSTextView для адаптации размеченному тексту.

Следующие три сообщения определяют, как размерности NSTextView изменяются в ответ на дополнения или удаления текста и к изменениям в размере представления прокрутки. NSTextView установлен расти вертикально, поскольку текст добавляется, но не горизонтально. Его маска изменения размеров установлена позволить ему изменять ширину в ответ на изменения в ширине superview. С тех пор, за исключением минимальных и максимальных значений, высота NSTextView определяется суммой текста, который это имеет в нем, его высота не должна изменяться с тем из его суперпредставления.

Последние два сообщения на этом шаге к NSTextContainer, не NSTextView. Одно сообщение устанавливает начальную ширину контейнера текста в то из представления прокрутки и его высоты к максимальному размеру текстового представления. Последнее сообщение говорит NSTextContainer изменять размеры своей ширины согласно ширине NSTextView. Вспомните, что текстовая система размечает текст согласно размерностям, сохраненным в объектах NSTextContainer. NSTextView обеспечивает место для текста, который будет выведен на экран, но его размерности и те из его NSTextContainer могут очень отличаться. setWidthTracksTextView:YES сообщение гарантирует, что, поскольку NSTextView изменен, размерность ширины, сохраненная в ее NSTextContainer, аналогично изменена, заставив текст быть размеченной в новых границах.

Сборка частей

Последний шаг должен собрать и вывести на экран части. Перечисление 3 показывает операторы, выполняющие этот шаг.

Перечисление 3  , Собирающее части

[scrollview setDocumentView:theTextView];
[theWindow setContentView:scrollview];
[theWindow makeKeyAndOrderFront:nil];
[theWindow makeFirstResponder:theTextView];

Установка горизонтальной полосы прокрутки

Для установки и горизонтальных и вертикальных полос прокрутки используйте операторы в Перечислении 4 вместо соответствующих операторов в предыдущих списках.

Перечисление 4  , Настраивающее горизонтальную полосу прокрутки

[[theTextView enclosingScrollView] setHasHorizontalScroller:YES];
[theTextView setHorizontallyResizable:YES];
[theTextView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
[[theTextView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[[theTextView textContainer] setWidthTracksTextView:NO];

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