Изменение атрибутов NSTextStorage заставляет представление прокрутки перемещаться

Я реализовал базовую подсветку синтаксиса, правильно установив NSTextStorage делегат моего NSTextView и изменение атрибутов текста в -textStorageDidProcessEditing,

Основной процесс заключается в следующем

- (void)textStorageDidProcessEditing:(NSNotification *)notification {
  NSTextStorage *storage = [notification object];
  [storage beginEditing];

  NSString *text = [storage string];
  NSRange textRange = NSMakeRange(0, [text length]);

  [storage removeAttribute:NSForegroundColorAttributeName range:textRange];

  // Some regex matching here ...

  [storage addAttribute:NSForegroundColorAttributeName
                  value:[COSyntax colorForPatternGroup:pattern.groupName]
                  range:capturedRanges[group]];

  [storage endEditing];
}

Всякий раз, когда -removeAttribute:range: или же -addAttribute:value:range вызывается, когда SPACE символ вводится, NSTextViewокружающие NSScrollView локация начинает прыгать (ручка прокрутки переходит в случайную позицию рядом с

Что вызывает это?

4 ответа

Решение

Я наконец-то узнал из своих наблюдений, что прыжок происходит не только при нажатии клавиши пробела, но и для других клавиш, таких как клавиша возврата, и это происходит именно тогда, когда происходят оба этих события.
- Несмежное расположение включено
- Любое изменение, даже атрибутов, текста, предшествующего видимой области, выполняется внутри -textStorageDidProcessEditing:
Похоже, это ошибка в функции несмежного макета! Было бы хорошо, если бы эксперт мог подтвердить.
Похоже, не имеет ничего общего с звонками -beginEditing а также -endEditing,

Эрик. Я не знаю, решили ли вы это. Однако я столкнулся с подобной проблемой и обнаружил, что отключение параметра "Несмежное расположение" в инспекторе атрибутов XCode 4.x для NSTextView на случай, если это решит проблему. Документация по NSLayoutManager содержит больше подсказок (в разделе "Обзор"): "Непрерывная компоновка - это необязательное поведение менеджера компоновки, новое в Mac OS X v10.5...".

Вот пост

В моем случае я сталкивался с таким поведением независимо от использования методов делегатов или промежуточных методов, вызываемых через уведомления, и происходило только тогда, когда содержимое хранилища текста становилось больше, чем текстовое представление, включающее в себя, вызывая активную прокрутку и "толкая" текстовое представление вверх., После выключения опции "прыжок" больше не наблюдался. Надеюсь, поможет. Том

Почему бы просто не удалить -beginEditing а также -endEditing звонки? У меня просто была такая же проблема, и это решает проблему для меня.

Оказывается зовет -beginEditing а также -endEditing внутри -textStorageDidProcessEditing: функция не очень здорова! Я перешел на NSTextViews -didChangeText вместо.

textView.layoutManager?.allowsNonContiguousLayout = false

решил мою проблему

Другие вопросы по тегам