Опитвам се да внедря ефект на сгъване на текст, за да скрия част от текста в 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