NSLineBreakByTruncatingTail прокручивает текст, когда установлен как стиль абзаца в NSTextView - PullRequest
3 голосов
/ 19 января 2012

У меня есть NSTextView, который должен быть фиксированного размера.Когда текст попадает в нижнюю строку и к правому краю обозначенного фрейма, мне нужно установить NSLineBreakByTruncatingTail, чтобы предоставить пользователю эллиптические знаки и отключить дальнейшую печать.Когда я делаю это, устанавливая стиль абзаца на textStorage из NSTextView, текст прокручивается вверх, и я вижу только последнюю строку с эллиптическими знаками в конце.У меня вопрос, как предотвратить прокрутку NSTextView при изменении lineBreakMode?

Спасибо, Нава

РЕДАКТИРОВАТЬ: (добавлены снимки экрана) До:

enter image description here

После:

enter image description here

Теперь вот код, который делает это:

- (void)textDidChange:(NSNotification *)notification
{
    NSString *text = [textView string];

    CGFloat width, height;
    NSRect  newFrame = self.frame;

    width = round([text widthForHeight:newFrame.size.height font:textView.font]);

    height = round([text heightForWidth:newFrame.size.width font:textView.font]);
    if (height > newFrame.size.height && width > newFrame.size.width) {
        NSTextContainer *textContainer = textView.textContainer;
        [textContainer setWidthTracksTextView:NO];
        [textContainer setHeightTracksTextView:NO];
        [textView setHorizontallyResizable:NO];
        [textView setVerticallyResizable:NO];
        [textView setAutoresizingMask:NSViewNotSizable];
        [textView setLineBreakMode:NSLineBreakByTruncatingTail];
    } 
}

Функции widthForHeight и heightForWidth - некоторые сторонние дополнения, которые работают хорошо.Проблема в этой внезапной прокрутке, которая происходит, когда я устанавливаю NSLineBreakByTruncatingTail.Вот функция, которая устанавливает режим разрыва строки (также стороннее добавление - от хорошего разработчика (не помню его имени)):

- (void)setLineBreakMode:(NSLineBreakMode)lineBreakMode {
    NSDictionary* curAttributes = [[self textStorage] attributesAtIndex:0
                                                              effectiveRange:NULL];

    NSParagraphStyle *currentStyle = [curAttributes objectForKey:NSParagraphStyleAttributeName];

    if (currentStyle.lineBreakMode != lineBreakMode) {

        NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy] ;
        [paragraphStyle setLineBreakMode:lineBreakMode] ;       
        NSMutableDictionary* attributes = [[[self textStorage] attributesAtIndex:0
                                                                  effectiveRange:NULL] mutableCopy] ;

        [attributes setObject:paragraphStyle
                       forKey:NSParagraphStyleAttributeName] ;
        [paragraphStyle release] ;
        NSAttributedString* attributedString = [[NSAttributedString alloc] initWithString:[self string]
                                                                               attributes:attributes] ;
        [attributes release] ;
        [[self textStorage] setAttributedString:attributedString] ;
        [attributedString release] ;

    }
}
...