2016-02-18 3 views
0

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

Иногда характер между этими словами является пробел или дефис, и т.д. В моем случае это точка :)

Это мой текст 50,0/80,0

В конце концов, я сделал это используя размер этикетки и измерения, сколько места мне нужно для этой строки, в частности:

UIFont *fontAwardNumber = [UIFont fontWithName:@"DIN-Bold" size:20]; 

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; 
CGSize labelSize = (CGSize){customCell.awardValueLabel.bounds.size.width, FLT_MAX}; 
CGRect rectNeededForAwardNumber = [awardNumber boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: fontAwardNumber} context:context]; 
if (rectNeededForAwardNumber.size.height > customCell.awardValueLabel.bounds.size.height) { 
    //We need to add a breakline 
    NSRange range = [awardNumber rangeOfString:@"/"]; 
    if (range.location != NSNotFound) { 
     awardNumber = [awardNumber stringByReplacingCharactersInRange:range withString:@"/\n"]; 
    } 
} 

я нашел другие решения, как заменить ваше пространство или дефис для неразрывных символов:

Preventing line breaks in part of an NSAttributedString

Но мой вопрос более общий характер, делает NSAttributedString обеспечить то, чтобы определить набор слов, как не ломкий? Или есть ли более простой способ сделать это для общего набора слов?

+0

Используйте 'NSParagraphStyle', установив режим прерывания строки на' ByWordWrapping', см. Этот ответ ... http://stackoverflow.com/a/19197903/499581 –

+0

Разрывы строк используют \, а не '/'. Ты знаешь, что это правильно? – LinusGeffarth

ответ

2

Нет, NSAttributedString не содержит никаких атрибутов каждого символа, которые препятствуют разрыву строки в пределах диапазона. Вы можете установить NSLineBreakMode на ByClipping или другой режим без обертывания в NSParagraphStyle, но это относится ко всему тексту абзаца. (Абзацы разделены символами новой строки.)

Чтобы предотвратить разрыв строки в меньшем диапазоне, чем целый абзац, вам необходимо вставить U+2060 WORD JOINER между любыми двумя символами, в которых может произойти нежелательный разрыв. В вашем примере это означает, что на каждой стороне символа косой черты.

+0

Я думаю, вы имеете в виду на каждой стороне символа точки, что персонаж, которого я не хочу сломать. Я попытался заменить последнее "." для U + 2060.U + 2060, это не сработало. Даже я попытался добавить эти символы между полным номером: U + 2060 50.0/80.0 U + 2060, но ничего. awardNumber = [NSString stringWithFormat: @ "% @% @% @", @ "\ u2060", awardNumber, @ "\ u2060"]; – xarly

+0

Также я добавил абзац: NSMutableParagraphStyle * style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [стиль setLineBreakMode: NSLineBreakByWordWrapping]; 'NSDictionary * attributes = @ {NSFontAttributeName: fontAwardNumber, NSParagraphStyleAttributeName: style}; NSMutableAttributedString * attribitedStringAwardNumber = [[NSMutableAttributedString alloc] initWithString: awardNumber attributes: attributes]; – xarly

Смежные вопросы