iPhone: разбить текст на строку для кадра - PullRequest
2 голосов
/ 22 марта 2012

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

1 Ответ

4 голосов
/ 22 марта 2012

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