Como faço para quebrar o texto em um UITableViewCell sem uma célula personalizado
-
02-07-2019 - |
Pergunta
Este é no iPhone 0S 2.0. Respostas para 2.1 são bons também, embora não tenho conhecimento de quaisquer diferenças em relação tabelas.
Parece que deve ser possível para obter o texto seja moldado sem criar uma célula personalizado, uma vez que um UITableViewCell
contém uma UILabel
por padrão. Eu sei que posso fazê-lo funcionar se eu criar uma célula de costume, mas isso não é o que eu estou tentando alcançar -. Eu quero entender por que minha abordagem atual não funciona
Eu descobri que o rótulo é criado sob demanda (uma vez que o acesso suportes célula de texto e imagem, para que ele não criar visualizar os dados até que seja necessário), então se eu fazer algo parecido com isto:
cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];
quando eu fico um rótulo válido, mas a definição numberOfLines
em que (e lineBreakMode) não funciona - Ainda fico com texto de linha única. Há uma abundância de altura na UILabel
para que o texto display -. Eu só estou retornando um grande valor para a altura em heightForRowAtIndexPath
Solução
Aqui está uma maneira mais simples, e ele funciona para mim:
Dentro de sua função cellForRowAtIndexPath:
. A primeira vez que você criar seu celular:
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];
}
Você notará que eu definir o número de linhas para o rótulo para 0. Isso permite que ele use quantas linhas ele precisa.
A próxima parte é para especificar o tamanho da sua UITableViewCell
será, então, fazer isso na sua função 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;
}
Eu adicionei 20 à minha altura da célula voltou porque eu como um pequeno tampão em torno de meu texto.
Outras dicas
Atualizado resposta de Tim Rupe para 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;
}
Um comentário breve / resposta para gravar a minha experiência quando eu tive o mesmo problema. Apesar de usar os exemplos de código, a altura da célula de exibição de tabela estava ajustando, mas o rótulo dentro da célula ainda não estava ajustando corretamente - solução foi que eu estava carregando meu celular a partir de um arquivo NIB personalizado, que acontece depois a altura da célula em ajustado.
E eu tinha minhas configurações dentro do arquivo NIB para não quebrar o texto, e só tem uma linha para a etiqueta; as configurações de arquivo nib foram substituindo as configurações I ajustadas dentro do código.
A lição que eu dava era para certificar-se de sempre ter em mente o que o estado dos objetos estão em cada ponto no tempo - eles não poderia ter sido criado ainda! ... hth alguém para baixo da linha.
Se quisermos adicionar apenas texto na célula UITableView
, precisamos apenas dois delegados para trabalhar com (sem necessidade de adicionar UILabels
adicional)
1) cellForRowAtIndexPath
2) heightForRowAtIndexPath
Esta solução funcionou para mim: -
-(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);
}
Aqui a mutArr
string é uma matriz mutável da qual eu estou recebendo meus dados.
EDIT: -. Aqui é a matriz que eu levei
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"];
Agora, os tableviews pode ter células auto-dimensionamento. Defina a exibição de tabela da seguinte forma
tableView.estimatedRowHeight = 85.0 //use an appropriate estimate
tableView.rowHeight = UITableViewAutomaticDimension
Eu uso as seguintes soluções.
Os dados são fornecidos separadamente em um membro:
-(NSString *)getHeaderData:(int)theSection {
...
return rowText;
}
O tratamento pode ser feito facilmente em cellForRowAtIndexPath
.
Definir a célula / definir a fonte e atribuir esses valores para o resultado "célula".
Note que o numberoflines
é definido como "0", que significa tomar o que é necessário.
- (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;
}
Em heightForRowAtIndexPath
, eu calcular as alturas do texto envolvido.
O tamanho boding deve estar relacionada com a largura do seu celular. Para iPad esta será 1024.
Para 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;
}
Eu encontrei este para ser bastante simples e direta:
[self.tableView setRowHeight:whatEvereight.0f];
para e.g. :
[self.tableView setRowHeight:80.0f];
Isto pode ou não pode ser a melhor abordagem / padrão para fazê-lo, mas ele trabalhou no meu caso.
Tente meu código em Swift. Este código irá trabalhar para UILabels normais também.
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
}
}
Agora chamar simplesmente como este
cell.textLabel.lblFunction()//Replace your label name
Eu acho que esta é uma solução melhor e mais curto. Apenas formatar o UILabel
(textLabel
) da célula para cálculo automático para a altura especificando sizeToFit
e tudo deve estar bem.
- (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;
}
Eu não acho que você pode manipular um UITableViewCell's
base de UILabel
privada para fazer isso. Você pode adicionar um novo UILabel
ao mesmo celular e uso numberOfLines
com sizeToFit
para dimensioná-lo adequadamente. Algo como:
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];