UILabel Word Wrap/Обертка символов
У меня есть UILabel с lineBreakMode
, установленным на UILineBreakModeWordWrap
. Это прекрасно работает, за исключением случаев, когда у меня длинная панель текста без пробелов. В этом случае он не обертывает длинную панель текста, а просто сокращает ее, как только она достигает правого края рамки UILabel. Как я могу сказать UILabel, что он должен обертывать границу символа в этой ситуации только (по существу эквивалентную настройке UILineBreakModeCharacterWrap
, но только для тех длинных плит без пробелов).
Спасибо заранее!
Ответы
Ответ 1
Для всех, у кого есть эта же проблема, я решил ее решить, используя UITextView
вместо UILabel
. Это было лучшее решение по двум причинам:
-
Для определения того, содержит ли текст пробелы и изменяет режим прерывания строки UILabel
на/из слова/символа, не требуется какое-либо индивидуальное поведение.
-
Что еще более важно, есть крайний случай, при котором у вас могут быть обычные слова (которые вы хотите обернуть на границах слов) плюс дополнительный длинный текст (который вам нужно обернуть на границах символов). За исключением написания какой-то логики, чтобы вставить пространство в этот дополнительный длинный текст (в правильном положении), чтобы заставить "фальшивый перенос слов", я не вижу никакого способа обработать обертку словами и символами, в зависимости от ситуации, в пределах UILabel
. UITextView
обрабатывает эту ситуацию автоматически, разбивая границы слов или границы символов по мере необходимости.
Для того, чтобы определить, как я это делаю, у меня есть одна строка UITextView
с отключением редактирования и прокрутки. Я также установил .contentInset
, чтобы удалить прокладку, чтобы она выглядела (к ничего не подозревающему глазу) точно так же, как UILabel
. Затем я использую метод sizeWithFont:constrainedToSize:lineBreakMode:
, чтобы определить кадр визуализируемого текста и соответственно отрегулировать кадр UITextView
так, чтобы он точно соответствовал тексту.
Надеюсь, что это поможет!
Ответ 2
Один из способов сделать это - установить свойство Lines в IB.
![enter image description here]()
или из кода сделайте это -
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 3;
Поэтому, когда вы устанавливаете количество строк как 3, текст обертывается до тех пор, пока не будет занято много строк.
Ответ 3
Вам нужно сделать это самостоятельно, нет возможности использовать "перенос слов", за исключением случаев, когда я не хочу, чтобы вы: "
Если слово было слишком длинным, вы могли вставлять пробелы в него, прежде чем отображать его, чтобы помочь ярлыку узнать, где его обернуть?
Ответ 4
декан прав. Если вы этого хотите, вам нужно сделать это вручную. Ниже приведен код, на котором будет отображаться ярлык, даже если он не пробегает. Это может помочь
NSString *someText = yourLabel.text;
//Check if the text contains spaces
//The method in the below if condition is user defined and you have to define one. lol
if(![self textContainsSpaces:someText])
{
//Do the word wrap manually
CGSize constraintSize;
constraintSize.width = 165;
constraintSize.height = 165;
CGSize stringSize =[someText sizeWithFont: [UIFont boldSystemFontOfSize: 17] constrainedToSize: constraintSize lineBreakMode: UILineBreakModeWordWrap];
CGRect rect = CGRectMake(yourLabel.frame.origin.x, yourLabel.frame.origin.y, 165, (stringSize.height+10));
yourLabel.frame = rect;
}