iPhone:将文本分成一行

时间:2012-03-22 17:44:39

标签: iphone core-text nsattributedstring

我有一个looong文本和一个宽度为300的UILabel,带有wordwrap模式。我需要知道如果将我的文本设置为此标签将会有多少行...而主要的是获取世界“你好”的行。怎么做 ?如何将文本分成具有一定宽度的某些帧的行并获取此行的数组?感谢....

1 个答案:

答案 0 :(得分:4)

嗯,要获得行数,您需要做的就是使用字符串并使用sizeWithFont:constrainedToSize:然后用标签的UIFont的lineHeight属性划分高度。

至于获取单独的行,我不确定是否有办法使用Objective-C执行此操作,因此您可能必须使用Core Text。

从字符串中创建NSAttributedString。

设置字体。

从NSAttributedString

创建CTFrameSetter

创建CTFrame

使用CTFrameGetLines

从CTFrame获取行的CFArrayRef

通过数组枚举并找到你的单词。

如果您使用快速枚举,那么您需要一个计数器来跟踪行号。

换行部分的示例:

CTFontRef myFont = CTFontCreateWithName([font fontName], [font pointSize], NULL);
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:string];
[attStr addAttribute:(NSString *)kCTFontAttributeName value:(id)myFont range:NSMakeRange(0, attStr.length)];


CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attStr);

CGPathRef path = [[UIBezierPath bezierPathWithRect:textFrame] CGPathRef];
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);

NSArray *lines = (NSArray *)CTFrameGetLines(frame);

根据您是否使用ARC,您必须添加适当的版本。

请注意,变量“font”是UIFont。如果要创建字体,则不必使用那些fontName和pointSize方法。

另请注意:这是CTLineRef对象的数组。使用CTLineGetStringRange获取整行的CFRange。然后使用它从NSString创建一个子字符串来进行搜索。

NSUInteger idx = 0;
for (CTLineRef line in lines) {
    CFRange lineRange = CTLineGetStringRange(line);
    NSRange range = NSMakeRange(lineRange.location, lineRange.length);

    NSString *lineString = [string substringWithRange:range];

    NSRange searchResultRange = [lineString rangeOfString:@"hello"];
    if (searchResultRange.location != NSNotFound) {
        // MATCH!
        break;
    }

    idx++;
 }