Изменение атрибутов 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:
функция не очень здорова! Я перешел на NSTextView
s -didChangeText
вместо.
textView.layoutManager?.allowsNonContiguousLayout = false
решил мою проблему