Невалидни глифове в TextKit

Опитвам се да внедря ефект на сгъване на текст, за да скрия част от текста в UITextView въз основа на атрибути в текстовото хранилище и след това да задам тези свойства на глиф на NSGlyphPropertyNull в метода layoutManager: shouldGenerateGlyphs: properties: characterIndexes: font:(UIFont *)aFont forGlyphRange:(NSRange)glyphRange. Тази част работи чудесно досега и прави това, което се очаква да прави. Проблемът е, когато се опитвам да принудя мениджъра на оформлението на текстовия изглед да преоформи текста. Опитах да извикам всички невалидни методи, но само един работи, invalidateGlyphsForCharacterRange: changeInLength: actualCharacterRange:. Предавам целия диапазон от знаци, 0 за changeInLength, тъй като всъщност не съм променил нищо, и NULL за actualCharacterRange. От време на време това работи добре. Но през повечето време получавам тази грешка, Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The index -4097 is invalid'. Какво не е наред с това? Ето част от моя код около това:

-(IBAction)showHideNotes:(id)sender {
    self.hideNotes = !self.hideNotes;
    [self.textView.layoutManager invalidateGlyphsForCharacterRange:NSMakeRange(0, _textStorage.string.length) changeInLength:0 actualCharacterRange:NULL];
    [self.textView setNeedsLayout];
}

По принцип целта ми е, когато потребителят докосне бутон, текстът или да се сгъне, или да се разгъне поради това. В метода UILayoutManagerDelegate, layoutManager: shouldGenerateGlyphs: properties: characterIndexes: font: forGlyphRange:, задавам глифовете, които искам да бъдат скрити, на NSGlyphPropertyNull само ако self.hidden е YES


person michaelkent94    schedule 08.11.2013    source източник


Отговори (1)


Проверете документите за invalidateGlyphsForCharacterRange:changeInLength:actualCharacterRange::

Този метод само обезсилва информацията за глифове и не извършва генериране или оформление на глифове. Тъй като невалидността на глифовете също обезсилва оформлението, след като извикате този метод, трябва да извикате и invalidateLayoutForCharacterRange:actualCharacterRange:, като подадете charRange като първи аргумент.

Също така се уверете, че спазвате другото документирано ограничение на този метод:

Този метод се използва от механизма за оформление и трябва да се извиква само по време на набор, в почти всички случаи само от мениджъра за оформление. Например персонализиран мениджър на оформление може да го извика.

Когато казвате, че настройвате глифовете, имате ли предвид, че извиквате setGlyphs:properties:characterIndexes:font:forGlyphRange: вътре в метода на делегата? Това би трябвало да е достатъчно, за да обезсили глифовете. („Извикването на този метод за диапазон от знаци, който е изчислил предварително информация за оформлението, прави оформлението и дисплея невалидни.“)

person Rob Napier    schedule 08.11.2013
comment
Актуализирах публикацията си, за да включа малко повече информация и повече къде се намира моят код в момента. Благодаря за помощта с документацията. Всъщност аз не наричам този метод правилно, така че ще разгледам повече другите. - person michaelkent94; 09.11.2013