У меня есть длинный текст и UILabel шириной 300 с режимом переноса слов. Мне нужно знать, сколько будет строк, если поставить мой текст на эту метку ... А главное, чтобы получилась строка, где находится мир "привет". Как это сделать ? Как разбить текст на строки для некоторого фрейма с некоторой шириной и получить массив этих строк? Спасибо....
iPhone: разбить текст на строку для рамки
Ответы (1)
Что ж, чтобы получить количество строк, все, что вам нужно сделать, это взять вашу строку и использовать sizeWithFont:constrainedToSize:
, а затем разделить высоту на свойство lineHeight UIFont вашей метки.
Что касается получения отдельных строк, я не уверен, есть ли способ сделать это с помощью Objective-C, поэтому вам, возможно, придется использовать Core Text.
Создайте NSAttributedString из вашей строки.
Установите шрифт.
Создайте CTFrameSetter из NSAttributedString
Создайте CTFrame
Получите CFArrayRef строк из CTFrame с помощью CTFrameGetLines
Пронумеруйте массив и найдите свое слово.
Если вы используете быстрое перечисление, вам понадобится счетчик для отслеживания номера строки.
Пример части разрыва строки:
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++;
}