我试图实现文本折叠效果,根据文本存储中的属性隐藏UITextView中的一些文本,然后在layoutManager: shouldGenerateGlyphs: properties: characterIndexes: font:(UIFont *)aFont forGlyphRange:(NSRange)glyphRange方法中将这些字形属性设置为NSGlyphPropertyNull。到目前为止,这部分发挥的很好,并且达到了预期的效果。问题是当我试图强制文本视图的布局管理器重新布局文本时。我尝试过调用所有的无效方法,但只有一个有效,invalidateGlyphsForCharacterRange: changeInLength: actualCharacterRange:。我传递了整个字符范围,0表示changeInLength,因为我实际上没有更改任何内容,而对于actualCharacterRange,则为NULL。每隔一段时间,这件事就会很好。但大多数时候我都会犯这个错误,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:中,只有当self.hidden是YES时,我才将希望隐藏的符号设置为NSGlyphPropertyNull
发布于 2013-11-08 19:06:52
检查文档中的invalidateGlyphsForCharacterRange:changeInLength:actualCharacterRange:
此方法仅使字形信息无效,并且不执行字形生成或布局。由于使象形文字无效也使布局无效,所以调用此方法后的invalidateLayoutForCharacterRange:actualCharacterRange:,也应该调用传递charRange的charRange作为第一个参数.。
此外,请确保您正在遵守此方法的其他文档限制:
布局机制使用此方法,只应在排版期间调用此方法,在几乎所有情况下,只应由布局管理器调用。例如,自定义布局管理器可能会调用它。
当您说要设置符号时,是否意味着在委托方法中调用setGlyphs:properties:characterIndexes:font:forGlyphRange:?这样做就足以使字形无效。(“对以前计算过的布局信息使布局和显示无效的字符范围调用此方法”)。
https://stackoverflow.com/questions/19866450
复制相似问题