Изменение атрибутов NSTextStorage заставляет представление прокрутки перемещаться - PullRequest
6 голосов
/ 16 марта 2011

Я реализовал базовую подсветку синтаксиса, правильно установив делегат 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, окружающее NSScrollView местоположение NSTextView начинает прыгать вокруг (ручка прокрутки переходит в какую-то случайную позицию рядом с)

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

Ответы [ 5 ]

11 голосов
/ 02 января 2012

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

6 голосов
/ 25 июля 2011

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

Вот пост

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

2 голосов
/ 28 декабря 2011

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

2 голосов
/ 16 марта 2011

Оказывается, вызов -beginEditing и -endEditing внутри функции -textStorageDidProcessEditing: не очень полезен! Вместо этого я переключился на NSTextView s -didChangeText.

0 голосов
/ 26 июня 2019

textView.layoutManager?.allowsNonContiguousLayout = false

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...