Mac OS X: как заставить редактор полей прокручивать текст вместо переноса?

У меня есть приложение Mac OS X Cocoa, основанное на документах.

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

Все работает нормально, за исключением одной проблемы. Я не могу понять, как сделать текстовое поле fieldEditorclip+ scroll, а не оборачивать его текст. Вот как это выглядит сейчас:

enter image description here

Видите, как текст переносится на вторую строку? Я не хочу этого. Я бы хотел, чтобы она оставалась одной строкой, которая прокручивается (и выглядит обрезанной).

Вот пример правильной работы с элементом списка с меньшим количеством текста:

enter image description here

Вот что я пытаюсь сделать в своем контроллере представления:

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.

5
задан Todd Ditchendorf 26 April 2013 в 16:16
поделиться

0 ответов