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;
        }