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