Как отключить перенос слов из NSTextView?

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

Ответы

Ответ 1

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

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

http://www.flickr.com/photos/[email protected]/4759470529/

alt text

http://www.flickr.com/photos/[email protected]/4759470533/

alt text

Update

Я обнаружил, что мой старый образец кода недостаточен, чтобы он полностью работал правильно. (из-за версии 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)
        }

Ответ 2

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

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

NSSize layoutSize = [textView maxSize];
layoutSize.width = layoutSize.height;
[textView setMaxSize:layoutSize];
[[textView textContainer] setWidthTracksTextView:NO];
[[textView textContainer] setContainerSize:layoutSize];

Ответ 3

Я нашел, что это решение предотвращает перенос строк, но имеет некоторые неудачные последствия рисования для 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.

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

Ответ 4

Самый простой способ - в Interface Builder, в инспекторе просто измените раскрывающееся меню.