Как отключить перенос слов в NSTextView? - PullRequest
16 голосов
/ 04 июля 2010

NSTextView выполняет перенос слов по умолчанию. Как я могу отключить это? Я делаю просмотрщик кода JSON, поэтому я должен отключить это.

Ответы [ 4 ]

25 голосов
/ 04 июля 2010

Я получил решение от: http://lists.apple.com/archives/cocoa-dev/2008/May/msg02396.html

Вы должны установить максимальную ширину NSTextView на очень большое число, чтобы это работало правильно. (Просто скопируйте максимальную высоту) И включить горизонтальную прокрутку NSScrollView, который является супервизором NSTextView. Смотрите эти картинки:

http://www.flickr.com/photos/47601728@N06/4759470529/

alt text

http://www.flickr.com/photos/47601728@N06/4759470533/

alt text

Обновление

Я обнаружил, что моего старого примера кода недостаточно, чтобы он полностью работал правильно. (из-за версии SDK?) Также Вот мой полный фрагмент исходного кода, который отключает перенос слов в OSX 10.8 SDK.

[self setMaxSize:CGSizeMake(FLT_MAX, FLT_MAX)];    
[self setHorizontallyResizable:YES];               
[[self textContainer] setWidthTracksTextView:NO];  
[[self textContainer] setContainerSize:CGSizeMake(FLT_MAX, FLT_MAX)];  

Обновление 2

Теперь Apple предоставляет официальное руководство для правильного создания NSTextView. Надеюсь, это поможет.

Обновление 3

Я опубликовал пример проекта на Github . Смотрите эту страницу для конкретной реализации: https://github.com/Eonil/CocoaProgrammaticHowtoCollection/blob/master/ComponentUsages/TextView/ExampleApplicationController.swift?ts=4

Вот фрагмент кода из примера проекта.

        if wordwrap {
            /// Matching width is also important here.
            let sz1                                     =   scroll1.contentSize
            text1.frame                                 =   CGRect(x: 0, y: 0, width: sz1.width, height: 0)
            text1.textContainer!.containerSize          =   CGSize(width: sz1.width, height: CGFloat.max)
            text1.textContainer!.widthTracksTextView    =   true
        } else {
            text1.textContainer!.widthTracksTextView    =   false
            text1.textContainer!.containerSize          =   CGSize(width: CGFloat.max, height: CGFloat.max)
        }
5 голосов
/ 15 августа 2013

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

Полный фрагмент кода из упомянутой ветки cocoa-dev дал правильные результаты. Конкретно этот набор шагов:

NSSize layoutSize = [textView maxSize];
layoutSize.width = layoutSize.height;
[textView setMaxSize:layoutSize];
[[textView textContainer] setWidthTracksTextView:NO];
[[textView textContainer] setContainerSize:layoutSize];
0 голосов
/ 13 апреля 2013

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

Моими решениями было включить изменение размера в NSPanel, ограничить его по горизонтали, установив минимальный и максимальный размеры и отключить горизонтальное изменение размера для самого текстового представления:

// some fragments from the creation of the NSPanel
// resizable NSPanel created
mMonitorPanel = [[NSPanel alloc] initWithContentRect: monitorRect
              styleMask: (NSTitledWindowMask| NSMiniaturizableWindowMask | NSResizableWindowMask)
                backing: NSBackingStoreBuffered defer: NO];

 // constrain resizing to horizontal only, with obvious limits ...
[mMonitorPanel setContentMaxSize: NSMakeSize(1000, 600)];
[mMonitorPanel setContentMinSize: NSMakeSize(300,  600)];

// a fragment from the init that creates an instance of a subclass of NSTextView ...

[self setVerticallyResizable: NO];
[self setHorizontallyResizable: NO];  // rather than YES as prior code snippet

// the rest is the same as above
[[self textContainer] setContainerSize: NSMakeSize(FLT_MAX, FLT_MAX)];
[[self textContainer] setWidthTracksTextView: NO];

Это приводит к тому, что панель монитора может быть изменена по горизонтали, не переносит линии и правильно рисует в своей NSPanel.

Надеюсь, это кому-то поможет - не знаю, где я 'без всех хороших исправлений, которые я нашел на этом сайте!

0 голосов
/ 04 июля 2010

Самый простой способ в Интерфейсном Разработчике, в инспекторе просто измените выпадающее меню.

...