2012-03-22 2 views
2

У меня есть текст с текстом и UILabel с шириной 300 со словом. Мне нужно знать, сколько строк будет, если установить мой текст на этот ярлык ... И главное, чтобы получить линию, где мир «привет». Как это сделать ? Как разбить текст на строки для некоторого кадра с некоторой шириной и получить массив этих строк? Спасибо ....iPhone: сломать текст в строке для рамки

ответ

4

Ну, чтобы получить количество строк, все, что вам нужно сделать, это взять вашу строку и использовать 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 или нет.

Обратите внимание, что переменная «шрифт» является 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++; 
} 
+0

Есть примеры? Или, пожалуйста, напишите код кода, пожалуйста? – Jim

+0

Не думал, что вы хотите пойти по тексту основного текста, поэтому я не добавил код. Я обновил свой ответ. –

+0

Я ценю за ваш ответ ... Это именно то, что мне нужно ... Большое спасибо ... – Jim

Смежные вопросы