Как отключить перенос слов из 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, в инспекторе просто измените раскрывающееся меню.