У меня есть приложение Mac OS X Cocoa, основанное на документах.
Одной из функций моего приложения является список текстовых элементов, которые можно редактировать двойным щелчком. Когда пользователь дважды щелкает один из текстовых элементов, я помещаю текстовое поле fieldEditor
текущего окна поверх щелкнутого текстового элемента, чтобы разрешить редактирование.
Все работает нормально, за исключением одной проблемы. Я не могу понять, как сделать текстовое поле fieldEditor
clip+ scroll, а не оборачивать его текст. Вот как это выглядит сейчас:
Видите, как текст переносится на вторую строку? Я не хочу этого. Я бы хотел, чтобы она оставалась одной строкой, которая прокручивается (и выглядит обрезанной).
Вот пример правильной работы с элементом списка с меньшим количеством текста:
Вот что я пытаюсь сделать в своем контроллере представления:
NSWindow *win = [listItemView window];
NSText *fieldEditor = [win fieldEditor:YES forObject:listItemView];
[fieldEditor setFont:[TDListItemView titleFont]];
[fieldEditor setAlignment:NSLeftTextAlignment];
[fieldEditor setDrawsBackground:YES];
[fieldEditor setBackgroundColor:[NSColor whiteColor]];
[fieldEditor setString:str];
[fieldEditor setDelegate:self];
[fieldEditor selectAll:nil];
if ([fieldEditor isKindOfClass:[NSTextView class]]) {
NSTextView *tv = (NSTextView *)fieldEditor;
NSMutableParagraphStyle *style = [[[tv defaultParagraphStyle] mutableCopy] autorelease];
[style setLineBreakMode:NSLineBreakByClipping];
[tv setDefaultParagraphStyle:style];
}
CGRect r = [self fieldEditorRectForBounds:[listItemView bounds] index:idx]; // height here is 10.0
[fieldEditor setFrame:r];
[fieldEditor setNeedsDisplay:YES];
[[self view] addSubview:fieldEditor];
[win makeFirstResponder:fieldEditor];
Обратите внимание на часть в середине: я проверяю, не fieldEditor
является экземпляром NSTextView
для вызова на нем метода setDefaultParagraphStyle:
. Это моя попытка заставить fieldEditor
обрезать его текст -- через значение NSLineBreakByClipping
. Это не имеет никакого эффекта. И я даже не уверен, что это то, что я должен делать, чтобы fieldEditor
прокручивал одну строку.
Также обратите внимание, что высота прямоугольника, которую я вычисляю в методе -fieldEditorRectForBounds:index:
, верна и предоставляет прямоугольник правильного размера для одной строки текста (14,0 пикселей в Это дело).
Чего мне не хватает, чтобы fieldEditor
отображал одну строку прокручиваемого/обрезанного текста?
Я также попытался добавить эти строки в среднюю часть:
[[tv textContainer] setHeightTracksTextView:YES];
[[tv textContainer] setWidthTracksTextView:YES];
Это дает желаемый эффект изменения размера видимой части fieldEditor
, что хорошо. Но плохая новость заключается в том, что это не меняет того факта, что текст по-прежнему переносится, а не обрезается + прокручивается. :(
Кажется, это связано с этой константой:
NSStringDrawingUsesLineFragmentOrigin
, которую можно использовать в options:
аргументе:
-[NSAttributedString drawWithRect:options:attributes:]
, но в моем случае я работаю с NSText Редактор полей
, а не NSAttributedString
. Я не могу понять, как сделать что-то подобное с помощью редактора полей NSText
.