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 回答