iPhone: разбить текст на строку для кадра

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

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 или нет.

Обратите внимание, что переменная "шрифт" является 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++;
 }
Другие вопросы по тегам