#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 и убедиться, что на метке установлены правильные флаги автоматического определения размера.