Первые две строки NSString с указанием ширины и шрифта - PullRequest
1 голос
/ 12 декабря 2011

У меня есть длинный NSString , UIFont и желаемый ширина . Я хотел бы получить только две первые строки строки, которая соответствует ширине с данным UIFont. Под «получить» я имею в виду получение подстроки. Вторая строка может быть усечена, и в первой строке должно быть слово перенос.

Как мне этого добиться? Пожалуйста, покажи мне правильное направление. Спасибо!

Ответы [ 5 ]

2 голосов
/ 12 декабря 2011

Я не думаю, что есть простой, чистый и элегантный способ сделать это.Но если вы посмотрите на справку NSString UIKit , есть методы, которые могут помочь получить хорошее приближение.

В частности, посмотрите:

 CGSize aSize = 
 [ myString  sizeWithFont:(UIFont *)aFont 
        constrainedToSize:(CGSize ) aSize ];

ИспользованиеaРазмер с желаемой шириной и 2 * fontSize (для 2 строк) для желаемой высоты.Возьмите полученную ширину (aSize.width) и разделите на размер шрифта.Это должно приблизиться к тому месту, где ваша строка будет обрезана, если бы она поместилась в этом поле.

Теперь, к сожалению, вам нужно соотношение шрифтов (отношение размера точки к ширине), которое я не знаю, как получить.Я точно определил, что это между 4 и 6, но это все равно, что сказать, что число пи равно 3.

Во всяком случае, приблизительный индекс, где ваша строка усекается, будет

 ( fontRatio * aSize.width ) / fontSize;

Я написал небольшой проект симулятора, чтобы проверить различные комбинации ширины линии, соотношения шрифта, размера шрифта и т. Д., Которые вы можете использовать.Это здесь: Струнный тестовый проект

1 голос
/ 12 декабря 2011

Как насчет этого?

- (NSString*) stringWithString:(NSString*)longString width:(float)width font:(UIFont*)font {

    if([longString sizeWithFont:font].width < width) {
        return longString;
    }

    NSMutableString* mutString = [NSMutableString stringWithFormat:@""];
    int i = 0;
    while ([mutString sizeWithFont:font].width < width && i < [longString length]) {
        unichar ch = [longString characterAtIndex:i];
        [mutString appendString:[NSString stringWithCharacters:&ch length:1]];
        i++;
    }

    NSString* shortenedString = [mutString substringToIndex:[mutString length] - 1];

    return shortenedString;
}

Обычно я добавляю символы по одному и каждый раз проверяю, достигнута ли желаемая ширина или нет.

Edit:

С переносом слов и двумя строками вы можете адаптировать код сверху и использовать следующий код для проверки размера:

[mutString sizeWithFont:font constrainedToSize:CGSizeMake(9999999, font.lineHeight*2) lineBreakMode:UILineBreakModeWordWrap]

Вместо отдельных символов вы можете сделать то же самое со словами:

[longString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]

Возвращает массив, содержащий все слова в строке, которые вы можете использовать для циклического прохождения.

0 голосов
/ 12 декабря 2011

Под "get" вы имеете в виду нарисовать его, обрезая после первых двух строк? Или получить строку, которая представляет, что вписывается в пространство для этих первых двух строк?

В первом случае вы можете просто нарисовать его, и UILabel урезается для вас.

Что касается последнего, я думаю, вам придется разбить слово на части и измерить подстроки, чтобы выяснить, что подходит.

0 голосов
/ 12 декабря 2011
const int kPadding = 4; // Padding for the diference between the font's height and the line height - it's 2 for front and 2 for bottom

float maxHeight = (FONT_SIZE+kPadding)*kNumberOfLinesYouNeed;
CGSize labelSize = [yourString sizeWithFont:yourFont constrainedToSize:CGSizeMake(kYourNeededWidth, maxHeight) lineBreakMode:UILineBreakModeWordWrap];
youLabel.frame=CGRectMake(yourX, yourY, kYourNeededWidth, maxHeight);

Прошу прощения за любые ошибки. Я написал эту форму моей голове.

0 голосов
/ 12 декабря 2011

Вы можете попробовать получить первые две строки текста в UILabel необходимой ширины. Вы можете установить шрифт для этой метки. Тогда у вас может быть другая метка, которая содержит оставшуюся часть текста другим шрифтом. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...