Estou usando um UITableViewCell personalizado que possui alguns rótulos, botões e visualizações de imagem a serem exibidos. Há um rótulo na célula cujo texto é um NSString
objeto e o comprimento da string pode ser variável. Devido a isso, não posso definir uma altura constante para a célula no método UITableView
's heightForCellAtIndex
. A altura da célula depende da altura da etiqueta que pode ser determinado usando o NSString
's sizeWithFont
método. Tentei usá-lo, mas parece que estou errado em algum lugar. Como pode ser consertado?
Aqui está o código usado para inicializar a célula.
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier])
{
self.selectionStyle = UITableViewCellSelectionStyleNone;
UIImage *image = [UIImage imageNamed:@"dot.png"];
imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(45.0,10.0,10,10);
headingTxt = [[UILabel alloc] initWithFrame: CGRectMake(60.0,0.0,150.0,post_hdg_ht)];
[headingTxt setContentMode: UIViewContentModeCenter];
headingTxt.text = postData.user_f_name;
headingTxt.font = [UIFont boldSystemFontOfSize:13];
headingTxt.textAlignment = UITextAlignmentLeft;
headingTxt.textColor = [UIColor blackColor];
dateTxt = [[UILabel alloc] initWithFrame:CGRectMake(55.0,23.0,150.0,post_date_ht)];
dateTxt.text = postData.created_dtm;
dateTxt.font = [UIFont italicSystemFontOfSize:11];
dateTxt.textAlignment = UITextAlignmentLeft;
dateTxt.textColor = [UIColor grayColor];
NSString * text1 = postData.post_body;
NSLog(@"text length = %d",[text1 length]);
CGRect bounds = [UIScreen mainScreen].bounds;
CGFloat tableViewWidth;
CGFloat width = 0;
tableViewWidth = bounds.size.width/2;
width = tableViewWidth - 40; //fudge factor
//CGSize textSize = {width, 20000.0f}; //width and height of text area
CGSize textSize = {245.0, 20000.0f}; //width and height of text area
CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:11.0f]
constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];
CGFloat ht = MAX(size1.height, 28);
textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
textView.text = postData.post_body;
textView.font = [UIFont systemFontOfSize:11];
textView.textAlignment = UITextAlignmentLeft;
textView.textColor = [UIColor blackColor];
textView.lineBreakMode = UILineBreakModeWordWrap;
textView.numberOfLines = 3;
textView.autoresizesSubviews = YES;
[self.contentView addSubview:imageView];
[self.contentView addSubview:textView];
[self.contentView addSubview:webView];
[self.contentView addSubview:dateTxt];
[self.contentView addSubview:headingTxt];
[self.contentView sizeToFit];
[imageView release];
[textView release];
[webView release];
[dateTxt release];
[headingTxt release];
}
Este é o rótulo cuja altura e largura estão incorretas:
textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
fonte
Se todas as suas linhas tiverem a mesma altura, basta definir a
rowHeight
propriedade do UITableView em vez de implementar oheightForRowAtIndexPath
. Documentos da Apple:fonte
tableView.rowHeight
estiver definido,heightForRowAtIndexPath
não será chamado, caso você esteja tentando descobrir o porquê (como eu estava).em um controlador UITableViewCell personalizado, adicione este
No controlador UITableView, adicione este
fonte
fonte
fonte
Vi muitas soluções, mas tudo estava errado ou incompleto. Você pode resolver todos os problemas com 5 linhas no viewDidLoad e no autolayout. Isto para o objetivo C:
Para o Swift 2.0:
Agora crie seu celular com xib ou em tableview no Storyboard. Com isso, você não precisa implementar nada mais ou substituir. (Não esqueça o número de linhas 0) e o rótulo inferior (restrinja) faça o downgrade "Prioridade de aceitação de conteúdo - vertical para 250"
Você pode fazer o download do código no próximo URL: https://github.com/jposes22/exampleTableCellCustomHeight
fonte
Para definir a dimensão automática para a altura da linha e a altura estimada da linha, verifique as etapas a seguir, para que a dimensão automática seja eficaz no layout de altura da célula / linha.
UITableViewAutomaticDimension
a rowHeight e estimadoRowHeightheightForRowAt
e retorne um valorUITableViewAutomaticDimension
a ele)-
Objetivo C:
Rápido:
Para instância de rótulo em UITableviewCell
Nota : Se você tiver mais de um rótulo (UIElements) com comprimento dinâmico, o qual deverá ser ajustado de acordo com o tamanho do conteúdo: Ajuste 'Prioridade de resistência a compressão e compressão de conteúdo' para rótulos que você deseja expandir / compactar com prioridade mais alta.
Aqui neste exemplo, defino prioridade de baixa resistência ao aperto e alta resistência à compressão, o que leva a definir mais prioridade / importância para o conteúdo do segundo rótulo (amarelo).
fonte
Graças a todas as postagens deste tópico, existem algumas maneiras realmente úteis de ajustar o rowHeight de um UITableViewCell.
Aqui está uma compilação de alguns dos conceitos de todos os outros que realmente ajudam na criação para o iPhone e iPad. Você também pode acessar diferentes seções e ajustá-las de acordo com os diferentes tamanhos de visualizações.
fonte
Para ter a altura dinâmica da célula à medida que o texto do Label aumenta, primeiro você precisa calcular a altura, que o texto usará no
-heightForRowAtIndexPath
método delegado e retorná-lo com as alturas adicionadas de outras etiquetas, imagens (altura máxima do texto + altura de outras imagens estáticas componenets) e use a mesma altura na criação de células.fonte