Як обернути текст у UITableViewCell без спеціальної комірки


151

Це на iPhone 0S 2.0. Відповіді для 2.1 теж тонкі, хоча я не знаю жодних відмінностей щодо таблиць.

Схоже, має бути можливість змусити обгортати текст без створення спеціальної комірки, оскільки a UITableViewCellмістить UILabelза замовчуванням. Я знаю, що можу змусити його працювати, якщо створити власну клітинку, але цього не намагаюся досягти - я хочу зрозуміти, чому мій поточний підхід не працює.

Я зрозумів, що мітка створена на вимогу (оскільки клітина підтримує доступ до тексту та зображень, тому вона не створює перегляд даних до необхідності), тож якщо я роблю щось подібне:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

то я отримую дійсну мітку, але налаштування numberOfLinesна це (і lineBreakMode) не працює - я все одно отримую однорядковий текст. UILabelТекст має достатньо висоти для відображення тексту - я просто повертаю велике значення для висоти в heightForRowAtIndexPath.

Відповіді:


277

Ось простіший спосіб, і він працює для мене:

Всередині вашої cellForRowAtIndexPath:функції. Перший раз, коли ви створюєте свою клітинку:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

Ви помітите, що я встановив кількість рядків для мітки на 0. Це дозволяє їй використовувати стільки рядків, скільки потрібно.

Наступна частина полягає в тому, щоб вказати, наскільки великою UITableViewCellбуде ваша величина, тому виконайте це у своїй heightForRowAtIndexPathфункції:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

Я додав 20 до поверненої висоти комірки, тому що мені подобається трохи буфера навколо мого тексту.


17
Вам не потрібно встановлювати ваше cell.textLabel.numberOfLines на якесь довільно високе число. Установити його на 0 означає "стільки рядків, скільки потрібно для відображення".
mmc

Дякую, я сьогодні відредагую свою публікацію після того, як отримаю можливість підтвердити це у власному проекті.
Тім Рупе

1
Установлення кількості рядків на 0 працює нормально (стільки рядків, скільки потрібно для відображення)
prakash,

1
cagreen: Виявляється, я можу це повторити, але лише в тому випадку, якщо в тренажері я використовую iPhone OS 3.0. Коли я використовую 3.1+, розмір деталіTextLabel точно відповідає розміру sizeWithFont. Тож метод Тіма працює дуже добре - просто для версії 3.1+ (ймовірно, через помилку / неправильність в режимі візуалізації осередків 3.0 за замовчуванням). Для запису я використовую вертикальний верхній / нижній запас 12 (кожен), розмір текстової мітки з деталізацією (188.0, CGFLOAT_MAX) та жирною системоюFontOfSize 15.
Джо Д'Андреа

17
UOSineBreakModeWordWrap застарілий у iOS 6. Замість цього використовуйте NSLineBreakByWordWrapping.
Етан Аллен

16

Оновлена ​​відповідь Тіма Рупа для iOS7:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:cellText
            attributes:@
            {
                NSFontAttributeName: cellFont
            }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 20;
}

3

Короткий коментар / відповідь, щоб записати мій досвід, коли у мене була така ж проблема. Незважаючи на використання прикладів коду, висота комірки виду таблиці коригувалась, але мітка всередині комірки все ще не коректувалась правильно. Рішення полягало в тому, що я завантажував свою клітинку з користувацького файлу NIB, що відбувається після коригування висоти комірки.

У мене були налаштування всередині файлу NIB, щоб не обертати текст, а мати лише 1 рядок для мітки; Параметри файлу NIB переосмислили налаштування, які я коригував усередині коду.

Урок, який я взяв, повинен був завжди мати на увазі, який стан об’єктів знаходиться в кожен момент часу - вони, можливо, ще не були створені! ... hth хтось вниз по лінії.


2

Якщо ми хочемо додати лише текст у UITableViewкомірці, нам потрібно працювати лише два делегати (не потрібно додавати зайвих UILabels)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Це рішення працювало для мене: -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;

    [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    cell.textLabel.text = [mutArr objectAtIndex:indexPath.section];
    NSLog(@"%@",cell.textLabel.text);

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    CGSize labelSize = CGSizeMake(200.0, 20.0);

    NSString *strTemp = [mutArr objectAtIndex:indexPath.section];

    if ([strTemp length] > 0)
        labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap];

    return (labelSize.height + 10);
}

Тут рядок mutArr- це змінний масив, з якого я отримую свої дані.

EDIT: - Ось масив, який я взяв.

mutArr= [[NSMutableArray alloc] init];

[mutArr addObject:@"HEMAN"];
[mutArr addObject:@"SUPERMAN"];
[mutArr addObject:@"Is SUPERMAN powerful than HEMAN"];
[mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"];
[mutArr addObject:@"Where are BATMAN and SPIDERMAN"];

2

Тепер огляди таблиці можуть мати осередки, що змінюють розмір. Встановіть подання таблиці таким чином

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

Apple Reference


0

Я використовую такі рішення.

Дані надаються окремо в члені:

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

Поводження легко здійснити в cellForRowAtIndexPath. Визначте комірку / визначте шрифт і призначте ці значення результату "комірка". Зауважте, що numberoflinesзначення "встановлено" на "0", що означає взяти те, що потрібно.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    cell.textLabel.text= [self getRowData:indexPath.section];
    cell.textLabel.font = cellFont;
    cell.textLabel.numberOfLines=0;
    return cell;
}

В heightForRowAtIndexPath, я обчислюю висоту загорнутого тексту. Розмір шпунтування повинен відповідати ширині вашої клітини. Для iPad це буде 1024. Для iPhone en iPod 320.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX);
    CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap];
    return requiredSize.height;    
}

0

Я вважав це досить простим і зрозумілим вперед:

[self.tableView setRowHeight:whatEvereight.0f];

наприклад:

[self.tableView setRowHeight:80.0f];

Це може бути чи не найкращим / стандартним підходом до цього, але в моєму випадку він спрацював.


Як я розумію, властивість rowHeight встановлює фіксовану висоту, яка буде використовуватися для всіх комірок у поданні таблиці. Використання rowHeight краще для роботи у великих таблицях, але якщо вам потрібно, щоб висота кожної комірки змінювалася залежно від її вмісту, тоді, здається, слід використовувати метод tableView: heightForRowAtIndexPath:.
jk7

0

Спробуйте мій код швидко. Цей код також буде працювати і для звичайних UILabels.

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

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

cell.textLabel.lblFunction()//Replace your label name 

-1

Я думаю, що це краще та коротше рішення. Просто відформатуйте UILabel( textLabel) комірки для автоматичного розрахунку висоти, вказавши, sizeToFitі все повинно бути добре.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = @"Whatever text you want to put here is ok";
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    [cell.textLabel sizeToFit];

    return cell;
}

-2

Я не думаю, що ви можете маніпулювати UITableViewCell'sприватною базою, UILabelщоб це зробити. Ви можете додати новий UILabelдо клітки себе і використовувати numberOfLinesз sizeToFitрозміром його відповідним чином . Щось на зразок:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.