カスタムテキストの切り捨てを行っているときに、それについて少し話している WWDC 2013 ビデオがあります。基本的には NSLayoutManagerDelegate メソッドを実装しlayoutManager: shouldGenerateGlyphs: properties: characterIndexes: font: forGlyphRange:
ます。このためのコードを実際に思いつくのに苦労しましたが、これはプロパティに基づく私の実装ですhideNotes
-(NSUInteger)layoutManager:(NSLayoutManager *)layoutManager shouldGenerateGlyphs:(const CGGlyph *)glyphs
properties:(const NSGlyphProperty *)props characterIndexes:(const NSUInteger *)charIndexes
font:(UIFont *)aFont forGlyphRange:(NSRange)glyphRange {
if (self.hideNotes) {
NSGlyphProperty *properties = malloc(sizeof(NSGlyphProperty) * glyphRange.length);
for (int i = 0; i < glyphRange.length; i++) {
NSUInteger glyphIndex = glyphRange.location + i;
NSDictionary *charAttributes = [_textStorage attributesAtIndex:glyphIndex effectiveRange:NULL];
if ([[charAttributes objectForKey:CSNoteAttribute] isEqualToNumber:@YES]) {
properties[i] = NSGlyphPropertyNull;
} else {
properties[i] = props[i];
}
}
[layoutManager setGlyphs:glyphs properties:properties characterIndexes:charIndexes font:aFont forGlyphRange:glyphRange];
return glyphRange.length;
}
[layoutManager setGlyphs:glyphs properties:props characterIndexes:charIndexes font:aFont forGlyphRange:glyphRange];
return glyphRange.length;
}
NSLayoutManager メソッドsetGlyphs: properties: characterIndexes: font: forGlyphRange:
はデフォルトの実装で呼び出され、基本的にすべての作業を行います。戻り値は、実際に生成するグリフの数です。0 を返すと、レイアウト マネージャーはデフォルトの実装を行うように指示されるため、渡されたグリフ範囲の長さを返すだけです。メソッドの主要部分は、テキストストレージに特定の属性がある場合は、関連付けられたプロパティを NSGlyphPropertyNull に設定します。これにより、レイアウトマネージャーにそれを表示しないように指示されます。それ以外の場合は、渡されたものにプロパティを設定するだけです。