Кілька рядків тексту в UILabel


443

Чи є спосіб мати кілька рядків тексту, UILabelяк у, UITextViewабо я повинен використовувати замість другого?


5
Зверніть увагу, що це UILineBreakModeWordWrapбуло застаріло в iOS 6. Тепер ви повинні використовувати NSLineBreakByWordWrapping = 0Дивіться документацію тут
Остін

перевірити це питання stackoverflow.com/questions/2312899 / ...
user1766342

Відповіді:


796

Я знайшов рішення.

Потрібно лише додати наступний код:

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

Відновлена ​​стара відповідь (для довідок та розробників, які бажають підтримувати iOS нижче 6.0):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Зі сторони: обидва значення перерахунку поступаються в 0будь-якому випадку.


16
UILineBreakModeWordWrap - це фактично за замовчуванням, тому вам не потрібен перший рядок.
Jarred Olson

1
Для тих, хто використовує swift: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingтаcell.textLabel?.numberOfLines = 0
boidkan

5
Дякуємо також за надання Xamarin-Code. Автодоповнення не спрацювало, оскільки вони вирішили скоротити цю властивість ... +1
Ян Гілліч

Я згоден з Jarred Olson, NSLineBreakByWordWrapping є по замовчуванням . Я додав властивість sizeToFit, як керівництво Gurumoorthy Arumugam, щоб виправити це. Якщо ви хочете, щоб шрифт всередині вашої мітки підкоригувався, щоб він відповідав меж метки. Ви можете використовувати: textLabel.adjustsFontSizeToFitWidth = ТАК; Дякую всім.
ryan tran

@JarredOlson Docs кажуть: "Цю властивість за замовчуванням встановлено параметромTruncatingTail."
Білл

138

У IB встановіть кількість рядків 0 (дозволяє необмежено рядків)

Вводячи в текстове поле за допомогою ІБ, використовуйте "alt-return", щоб вставити повернення та перейти до наступного рядка (або ви можете скопіювати текст, вже відокремлений рядками).


1
[Коли він свідомо викопує нитку більше одного року ...] Одне, що я іноді бажаю, щоб я міг зробити в IB, це введення тексту без вбудованих перерв рядків, встановити UILineBreakModeWordWrap і numberOfLines = 0, а потім мати авто -розміри висоти автоматично, весь час все ще проектуючи в IB. Я думаю про випадок, коли погляд змінюється на пейзаж, де розриви рядків у мітці можуть бути проблематичними. Або ... я міг би неправильно використовувати ІБ! Можливо, наявність автоматичного розміру міток в IB спричиняє більше проблем, ніж вирішує? (Крім того, ви не можете посилатися на sizeToFit в цьому випадку.)
Джо Д'Андреа,

Річ "0", яку я отримав від документів для UILabel, альт-повернення від друга, який вже багато років використовує Interface Builder.
Kendall Helmstetter Gelner

3
+1 за те, що є єдиною відповіддю на згадку про "alt-return". Зокрема, "ctrl-return", здається, працює, але не працює.
paulmelnikow

52

Найкраще рішення, яке я знайшов (інакше засмучуючу проблему, яку слід було б вирішити в рамках), схоже на рішення вайчик.

Просто встановіть кількість рядків на 0 у IB чи коді

myLabel.numberOfLines = 0;

Це відобразить потрібні лінії, але переставить мітку так, щоб її було по центру горизонтально (так, щоб мітка на 1 і 3 рядки була вирівняна у горизонтальному положенні). Щоб виправити додавання:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;

Вирішіть мій Запит за допомогою вас і @Ilya Suzdalnitski. Дуже дякую.
Міхір Оза

33

Використовуйте це, щоб мати кілька рядків тексту в UILabel:

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

Швидкий:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

Якщо вам потрібно скористатися:

myLabel.numberOfLines = 0;

властивості Ви також можете використовувати стандартний розрив рядка ("\n")в коді, щоб примусити новий рядок.


15

Ви можете використовувати \rдля переходу до наступного рядка під час заповнення UILabelвикористання NSString.

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];

14

давайте спробуємо це

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          

також це може бути встановлено в атрибуті IB 'Lines' на 0 на UILabel.
KoreanXcodeWorker

11
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Наведене вище рішення не працює в моєму випадку. Я роблю так:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}


8

Swift 3
Встановіть кількість рядків нульову для динамічної текстової інформації, це буде корисно для зміни тексту.

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

введіть тут опис зображення


1
Дякую, Krunal, що це працює на мене!
Йогеш Патель

6
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

Чомусь це не працює для мене в iOS 6, не знаю, чому. Спробував це з атрибутивним текстом і без нього. Будь-які пропозиції.


6

Спробуйте скористатися цим:

lblName.numberOfLines = 0;
[lblName sizeToFit];

sizeToFit не працює, коли числоOfLine відрізняється від 0. Це цікаво.
Онур Тун

3

Ці речі мені допомогли

Змініть ці властивості UILabel

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

І надаючи рядок введення, використовуйте \ n для відображення різних слів у різних рядках.

Приклад:

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;

3

Спосіб 1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Тепер дзвоніть просто так

myLbl.lblFunction()//Replace your label name 

EX:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Спосіб 2:

Програмно

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

Спосіб 3:

Через дошку Story

Для відображення декількох рядків, встановлених 0 (нульовим), це відображатиме більше, ніж один рядок у вашій мітці.

Якщо ви хочете відобразити n рядків, встановіть n.

Дивіться нижче екран.

введіть тут опис зображення

Якщо ви хочете встановити мінімальний розмір шрифту для мітки, натисніть Автоматичне посилання та виберіть опцію Мінімальний розмір шрифту

Дивіться нижче екрани

введіть тут опис зображення

Тут встановлено мінімальний розмір шрифту

EX: 9 (на цьому зображенні)

Якщо ваш ярлик отримає більше тексту на той час, текст вашої мітки буде скорочуватися до 9

введіть тут опис зображення


2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

не забудьте додати: [labelName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu Licks Filho

2

Ви також можете це зробити через Дошку розгортки:

  1. Виберіть мітку на контролері перегляду
  2. У Інспекторі атрибутів збільшити значення параметра "Лінія" (Натисніть Alt + Cmd + 4, щоб показати інспектор атрибутів)
  3. Двічі клацніть мітку на контролері перегляду та напишіть або вставте текст
  4. Змініть розмір мітки та / або збільште розмір шрифту, щоб весь текст міг бути показаний

і встановіть рядки на 0, інакше він відображатиме лише текст, який можна ввести у вказану кількість рядків, інші буде опущено.
toing_toing

2

ви повинні спробувати це:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}

1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

1

Вже відповів, але ви також можете це зробити вручну в раскадровці. У розділі Інспектор атрибутів для мітки ви можете змінити переривання рядків на обертання слів (або обертання символів).


1

У цій функції передайте рядок, яку ви хочете призначити міткою та розмістити шрифт замість self.activityFont та пропустити ширину мітки замість 235, тепер ви отримуєте висоту мітки відповідно до рядка. це буде добре працювати.

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}

1

Встановіть нижче або в коді, або в самій раскадровці

Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;

і, будь ласка, не забудьте встановити ліві, праві, верхні та нижні обмеження для мітки, інакше це не працюватиме.


Скрізь сказано встановити слово wrap та no.of рядків на 0. Але все одно моє не перегорне. Якщо встановити лівий, верхній, нижній і правий обмеження, це призвело до загортання.
anoo_radha

1

Швидкий 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

0

На C #, це працювало для мене всередині UITableViewCell.

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

Я думаю, що тут важливо:

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

-2

Цей код повертає висоту розміру відповідно до тексту

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.