У меня есть NSTextView, который я хочу отобразить горизонтальную полосу прокрутки. Следуя некоторым предложениям в Интернете, у меня большая часть работает, за исключением того, что у меня проблемы с вертикальной полосой прокрутки.
Что я сделал, так это нашел ширину самой длинной строки (в пикселях с заданным шрифтом), а затем изменил размеры NSTextContainer и NSTextView соответствующим образом. Таким образом, горизонтальная полоса прокрутки представляет ширину, а прокрутка вправо прокручивает до конца самой длинной строки текста.
После выполнения этой работы я заметил, что мой NSScrollView будет показывать и скрывать вертикальную полосу прокрутки, когда я печатал. Я «исправил» эту проблему, установив autohidesScrollers на NO до изменения размера, а затем YES после. Тем не менее, остается еще одна проблема, когда при вводе текста вертикальная полоса прокрутки thumb переходит на верхнюю часть полосы прокрутки и обратно в нужное место при вводе. Я набираю 'a' , он переходит наверх, я снова нажимаю и он возвращается к нужному месту.
Есть мысли?
Вот пример кода:
- (CGFloat)longestLineOfText
{
CGFloat longestLineOfText = 0.0;
NSRange lineRange;
NSString* theScriptText = [myTextView string];
NSDictionary* attributesDict = [NSDictionary dictionaryWithObject:scriptFont forKey:NSFontAttributeName]; //scriptFont is a instance variable
NSUInteger characterIndex = 0;
NSUInteger stringLength = [theScriptText length];
while (characterIndex < stringLength) {
lineRange = [theScriptText lineRangeForRange:NSMakeRange(characterIndex, 0)];
NSSize lineSize = [[theScriptText substringWithRange:lineRange] sizeWithAttributes:attributesDict];
longestLineOfText = max(longestLineOfText, lineSize.width);
characterIndex = NSMaxRange(lineRange);
}
return longestLineOfText;
}
// ----------------------------------------------------------------------------
- (void)updateMyTextViewWidth
{
static CGFloat previousLongestLineOfText = 0.0;
CGFloat currentLongestLineOfText = [self longestLineOfText];
if (currentLongestLineOfText != previousLongestLineOfText) {
BOOL shouldStopBlinkingScrollBar = (previousLongestLineOfText < currentLongestLineOfText);
previousLongestLineOfText = currentLongestLineOfText;
NSTextContainer* container = [myTextView textContainer];
NSScrollView* scrollView = [myTextView enclosingScrollView];
if (shouldStopBlinkingScrollBar) {
[scrollView setAutohidesScrollers:NO];
}
CGFloat padding = [container lineFragmentPadding];
NSSize size = [container containerSize];
size.width = currentLongestLineOfText + padding * 2;
[container setContainerSize:size];
NSRect frame = [myTextView frame];
frame.size.width = currentLongestLineOfText + padding * 2;
[myTextView setFrame:frame];
if (shouldStopBlinkingScrollBar) {
[scrollView setAutohidesScrollers:YES];
}
}
}