Перенос текста в UITableView в iOS

#iphone #objective-c #ios #uitableview

#iPhone #objective-c #iOS #uitableview

Вопрос:

Я хочу перенести текст ячеек в UITableView. Я использую следующий код, но выравнивание ячеек не выполняется должным образом, как теперь динамически изменять высоту ячейки? Я заметил, что в делегате TableView есть встроенный метод — (CGFloat) cellHeightForRow, но я могу динамически вводить текст и устанавливать высоту, поскольку у меня есть текст переменной длины в моих данных JSON

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
    if (cell == nil) {  
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];  
    }  
    [cell.textLabel sizeToFit];
    cell = [[[UITableViewCell alloc]
             initWithStyle: UITableViewCellStyleSubtitle
             reuseIdentifier: @"UITableViewCell"] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;

    NSDictionary *person = [myPeople objectAtIndex:[indexPath row]]; 

    NSString *name = [person valueForKey:@"name"];
    cell.detailTextLabel.text = [person valueForKey:@"time"];
    return cell; 
}
  

Это то, что я пробовал до сих пор :

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSDictionary *person = [myPeople objectAtIndex:[indexPath row]]; 
    NSString *cellText    =[person valueForKey:@"text"];
    UIFont *cellFont      = [UIFont fontWithName:@"Helvetica-neuve" size:21.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize      = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
    int buffer  = 10;
    return labelSize.height   buffer;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";  

    UITableViewCell *cell = [commentView dequeueReusableCellWithIdentifier:CellIdentifier];  
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 6;
        cell.textLabel.font          = [UIFont fontWithName:@"Helvetica-neuve" size:21.0];
        [cell.textLabel setMinimumFontSize:13.0];
        [cell.textLabel setAdjustsFontSizeToFitWidth:NO];
    } 

    NSDictionary *person = [myPeople objectAtIndex:[indexPath row]]; 

    NSString *personName = [person valueForKey:@"text"];
        cell.textLabel.text = personName;
   // cell.detailTextLabel.text = [person valueForKey:@"date"];

    return cell; 
}
  

Тем не менее вывод выглядит слишком громоздким и плотным

Ответ №1:

Внутри вашей 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:@"HelveticaNeue" size:21.0];
}
  

Вы заметите, что также я установил количество строк для метки равным 0. Это позволяет использовать столько строк, сколько ему нужно.

Вам также необходимо указать, насколько большим будет ваш UITableViewCell , поэтому сделайте это в своей heightForRowAtIndexPath функции:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText    = @"some text which is part of cell display";
    UIFont *cellFont      = [UIFont fontWithName:@"HelveticaNeue" size:21.0];    
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize      = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
    int buffer  = 10;
    return labelSize.height   buffer;
}
  

Я добавил дополнительную 10 к возвращаемой высоте ячейки, потому что мне нравится небольшой буфер вокруг моего текста.

ОБНОВЛЕНИЕ: если вывод выглядит слишком плотным и комковатым, сделайте это —

 [cell.textLabel setMinimumFontSize:13.0];
[cell.textLabel setAdjustsFontSizeToFitWidth:NO];
  

Это должно решить вашу проблему.

Комментарии:

1. Я использовал [cell.textLabel setNumberOfLines: 6] и cell.detailLabel.numberOfLines = 0, но он все тот же.

2. Я использовал UITableViewCellStyleSubtitle, поскольку мне нужно время в качестве субтитра

3. круто, никаких проблем. попробуйте остальную часть моего решения, UITableViewCellStyleSubtitle или Default это не должно иметь значения

4. Я думаю, что я делаю что-то не так.. NSString * cellText = @»некоторый текст, который является частью отображения ячейки»; должен быть заменен данными json, которые я хочу отобразить? Правильно?

5. да. то, что я поместил, — это просто шаблон, образец. вам нужно изменить это на текст, который вы будете отображать…

Ответ №2:

Чтобы изменить высоту вашей ячейки, вам нужно изменить ее рамку в cellForRowAtInexPath и убедиться, что на метке установлены правильные флаги автоматического определения размера.