3

コードを投稿することさえしない馬鹿のように感じますが、iOS7 Text Kit がテキスト折りたたみのサポートを追加するという記事をいくつか読んだ後、テキストを折りたたむために設定するサンプル コードや属性を実際に見つけることができず、Apple のドキュメントのようですミュートします。

http://asciiwwdc.com/2013/sessions/220では、おそらく setTextContainer:forGlyphRange をオーバーライドして、テキストの領域を独自のテキスト コンテナーに設定し、それを表示/非表示にしていると思います。

私はどこか近くにいますか?

ありがとう

4

1 に答える 1

7

カスタムテキストの切り捨てを行っているときに、それについて少し話している 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 に設定します。これにより、レイアウトマネージャーにそれを表示しないように指示されます。それ以外の場合は、渡されたものにプロパティを設定するだけです。

于 2013-11-15T03:53:43.567 に答える