如何在iOS 7中折叠文本?

时间:2013-11-09 12:58:02

标签: ios uitextview

我觉得自己像个白痴,甚至没有发布一些代码,但在阅读了几篇文章,说明iOS7 Text Kit增加了对文本折叠的支持,我实际上找不到任何示例代码或属性来设置文本以折叠它和Apple的文档似乎无声。

http://asciiwwdc.com/2013/sessions/220让我想到我将文本区域设置到自己的文本容器中,然后显示/隐藏它,可能是通过覆盖setTextContainer:forGlyphRange:

我在附近吗?

由于

1 个答案:

答案 0 :(得分:6)

有一个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,告诉布局管理器不显示它,否则它只是将属性设置为传入的属性。