Как обрезать NSString в строке x?

Это должен быть несколько простой вопрос. Я пытаюсь обрезать NSString до любого текста, который находится в пределах максимальной высоты 150 пикселей, а затем добавить «Продолжить чтение» в конец этого обрезанного текста. Итак, скажем, у нас есть следующее.

a
b
c
d
e
f
g
h
i
j
k
l
m

И у нас есть шрифт, скажем, 13... мы вычисляем общую высоту текста и видим, что он больше 150 пикселей в высоту при шрифте 13 пикселей. Мой вопрос: как мне отрезать часть строки, превышающую эти 150 пикселей?


person Braydon Batungbacal    schedule 26.01.2014    source источник
comment
Смотрите ответ здесь: stackoverflow.com/questions/15113461/   -  person InsertWittyName    schedule 26.01.2014


Ответы (3)


Я делаю что-то действительно довольно глупое (грубая сила), чтобы добиться этого в своем приложении. Я вручную создаю новые символы строки и отступы в UILabel. Для этого я нахожу первый пробел в тексте (чтобы получить конец первого слова), проверяю, не выходит ли он за мои границы. Если нет, я перехожу ко второму пространству и проверяю это.

Чтобы сделать для вас что-то более разумное, я бы разделил вашу строку пополам, а затем посмотрел, превышает ли эта половина ваши границы. Если да, то перейдите к 1/4, если нет, то перейдите к 3/4 и проверьте это. Затем, как только вы найдете символ, который заставляет вас превышать свой лимит, выполните обратный поиск пробела (чтобы найти последнее подходящее слово) и усеките свою строку там. Это может показаться сложным кодом, но это точно так же, как алгоритм бинарного поиска, но через вашу строку.

person Putz1103    schedule 26.01.2014

Вы можете просто использовать

-(CGSize)sizeWithFont:(UIFont*)font forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode;

потому что он учитывает все символы \n и вычисляет правильный CGSize.

person malex    schedule 26.01.2014

вы могли бы использовать

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(NSLineBreakMode)lineBreakMode

(на iOS7 лучше использовать boundingRectWithSize:options:attributes:context:)

Продолжайте добавлять одну строку к строке while (size.height<150.0f).

EDIT: этот пример может работать: (Примечание: если вы не используете ARC, trimmedStr должен быть автоматически освобожден!)

- (NSString*) stringByTrimmingString:(NSString*)str forSize:(CGSize)maxSize withFont:(UIFont*)font
{
    NSMutableString* trimmedStr = [NSMutableString new];
    for (NSString* line in [str componentsSeparatedByString:@"\n"]) {

        NSString *testStr = [trimmedStr stringByAppendingFormat:@"%@\n",line];

        CGSize sz = [testStr sizeWithFont:font forWidth:maxSize.width lineBreakMode:NSLineBreakByWordWrapping];
        if (sz.height > maxSize.height) {
                return [trimmedStr copy];
        }
        [trimmedStr appendFormat:@"%@\n",line];
    }
    return [trimmedStr copy];
}
person akw    schedule 26.01.2014