我有一个NSTextAttachment子类,覆盖了attachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
imageForBounds:textContainer:characterIndex:
。
我需要在某些时候重新绘制附件。在UITextView上调用setNeedsDisplay
并不起作用。
有什么想法吗?我想避免重新创建附件和/或属性字符串。
答案 0 :(得分:16)
您希望使用textView.layoutManager
方法之一。
invalidateDisplayCharacterRange:
imageForBounds:textContainer:characterIndex:
将再次被召唤。attachmentBoundsForTextContainer:[...]Index:
将不再再次调用。image
,则效果很好。invalidateLayoutForCharacterRange:actualCharacterRange:
imageForBounds:textContainer:characterIndex:
将再次被召唤。attachmentBoundsForTextContainer:[...]Index:
将再次被召唤。image
已使用另一个不同尺寸更改,则表现良好。如果您只想更新单个附件,您可能会发现我写的这个帮助方法很有帮助:
- (NSRange)rangeOfAttachment:(NSTextAttachment *)attachment {
__block NSRange ret;
[self.textStorage enumerateAttribute:NSAttachmentAttributeName
inRange:NSMakeRange(0, self.textStorage.length)
options:0
usingBlock:^(id value, NSRange range, BOOL *stop) {
if (attachment == value) {
ret = range;
*stop = YES;
}
}];
return ret;
}
您可以将此方法的结果NSRange
传递给这些invalidate
方法中的任何一个的第一个参数。对于第二种方法的actualCharacterRange:
参数,我已经传递了NULL
而没有任何问题。
答案 1 :(得分:3)
答案 2 :(得分:-1)
如果您只想更改图像初始化的NSTextAttachment,建议您使用
setAttachmentSize:size forGlyphRange:range