UILabel Word Wrap / перенос символов - PullRequest
10 голосов
/ 02 декабря 2011

У меня есть UILabel с lineBreakMode, установленным на UILineBreakModeWordWrap. Это прекрасно работает, за исключением случаев, когда у меня есть длинный кусок текста без пробелов. В этом случае он не оборачивает длинный кусок текста, а просто обрезает его, как только он достигает правого края фрейма UILabel. Как я могу сказать UILabel, что в этой ситуации он должен переноситься по границе символа только (по сути, эквивалентно настройке UILineBreakModeCharacterWrap, но только для тех длинных листов без пробелов текста).

Заранее спасибо!

Ответы [ 4 ]

10 голосов
/ 04 декабря 2011

Для тех, у кого есть такая же проблема, я решил ее, используя UITextView вместо UILabel.Это было лучшим решением по двум причинам:

  1. Не требуется никакого специального поведения, чтобы определить, содержит ли текст пробелы, и изменить режим разрыва строки в UILabel на / изперенос слов / символов.

  2. Что еще более важно, существует крайний случай, когда у вас могут быть нормальные слова (которые вы хотите обернуть по границам слов) плюс очень длинный текст (который вам нужнообернуть границы персонажа).Если не считать какой-то логики для вставки пробела в этот очень длинный текст (в правильной позиции) для принудительной «обтекания поддельным словом», я не вижу способа справиться с переносом слов и символов в зависимости от ситуации,в пределах одного UILabel.UITextView автоматически обрабатывает эту ситуацию, нарушая границы слов или символов по мере необходимости.

Для получения дополнительной информации о том, как я это делаю, у меня есть одна строка UITextView с редактированиеми прокрутка отключена.Я также установил .contentInset, чтобы убрать заполнение, чтобы оно выглядело (ничего не подозревающему глазу), как UILabel.Затем я использую метод sizeWithFont:constrainedToSize:lineBreakMode: для определения рамки отображаемого текста и соответствующим образом настраиваю рамку UITextView так, чтобы она точно соответствовала тексту.

Надеюсь, что это поможет!

3 голосов
/ 02 декабря 2011

Один из способов сделать это - установить свойство Lines в IB.

enter image description here

или из кода сделать это -

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 3;

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

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

Дин прав.Если вы хотите, вы должны сделать это вручную.Приведенный ниже код закодирует метку, даже если она не содержит пробелов.Это может помочь

         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;
        }
0 голосов
/ 02 декабря 2011

Вы должны сделать это сами, для ' нет возможности использовать перенос слов, кроме случаев, когда я не хочу, чтобы вы ':)

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

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