1

我正在尝试实现文本折叠效果,以根据文本存储中的属性隐藏 UITextView 中的一些文本,然后在layoutManager: shouldGenerateGlyphs: properties: characterIndexes: font:(UIFont *)aFont forGlyphRange:(NSRange)glyphRange方法中将这些字形属性设置为 NSGlyphPropertyNull。到目前为止,该部分工作得很好,并且完成了预期的工作。问题是当我尝试强制文本视图的布局管理器重新布局文本时。我试过调用所有的无效方法,但只有一个有效,invalidateGlyphsForCharacterRange: changeInLength: actualCharacterRange:. 我传入了整个字符范围,changeInLength 为 0,因为我实际上没有更改任何内容,而 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:,我将我想要隐藏的字形设置为 NSGlyphPropertyNull 仅self.hiddenYES

4

1 回答 1

1

检查文档invalidateGlyphsForCharacterRange:changeInLength:actualCharacterRange:

此方法仅使字形信息无效,不执行字形生成或布局。因为使字形无效也会使布局无效,所以在调用此方法后,您还应该调用 invalidateLayoutForCharacterRange:actualCharacterRange:,将 charRange 作为第一个参数传递。

还要确保您遵守此方法的其他记录限制:

此方法由布局机制使用,仅应在排版期间调用,几乎在所有情况下仅由布局管理器调用。例如,自定义布局管理器可能会调用它。

当你说你正在设置字形时,你的意思是你在setGlyphs:properties:characterIndexes:font:forGlyphRange:委托方法内部调用吗?这样做应该足以使字形无效。(“为先前计算过布局信息的字符范围调用此方法会使布局和显示无效。”)

于 2013-11-08T19:06:52.483 回答