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

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


person Jim    schedule 22.03.2012    source источник


Ответы (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++;
 }
person Kevin Low    schedule 22.03.2012
comment
Есть примеры? Или напишите, пожалуйста, кусочек кода? - person Jim; 22.03.2012
comment
Не думал, что вы захотите пойти по маршруту Core Text, поэтому не стал добавлять код. Я обновил свой ответ. - person Kevin Low; 22.03.2012