J'utilise un UITableViewCell personnalisé qui a des étiquettes, des boutons et des vues d'image à afficher. Il existe une étiquette dans la cellule dont le texte est un NSString
objet et la longueur de la chaîne peut être variable. En raison de cela, je ne peux pas définir une hauteur constante à la cellule dans la UITableView
de heightForCellAtIndex
méthode. La hauteur dépend de la hauteur de l'étiquette de la cellule qui peut être déterminée en utilisant la NSString
de » sizeWithFont
méthode. J'ai essayé de l'utiliser, mais il semble que je me trompe quelque part. Comment peut-il être corrigé?
Voici le code utilisé pour initialiser la cellule.
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];
}
C'est l'étiquette dont la hauteur et la largeur ne vont pas:
textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
la source
Si toutes vos lignes ont la même hauteur, définissez simplement la
rowHeight
propriété de UITableView plutôt que d'implémenterheightForRowAtIndexPath
. Documents Apple:la source
tableView.rowHeight
est défini,heightForRowAtIndexPath
ne sera pas appelé, au cas où vous essayez de comprendre pourquoi (comme je l'étais).dans un contrôleur UITableViewCell personnalisé, ajoutez ceci
Dans le contrôleur UITableView, ajoutez ceci
la source
la source
la source
J'ai vu beaucoup de solutions mais tout était faux ou incomplet. Vous pouvez résoudre tous les problèmes avec 5 lignes dans viewDidLoad et autolayout. Ceci pour l'objectif C:
Pour swift 2.0:
Maintenant, créez votre cellule avec xib ou dans tableview dans votre Storyboard Avec cela, vous n'avez plus besoin de rien implémenter ou de remplacer. (N'oubliez pas le numéro des lignes 0) et le libellé inférieur (contraindre) rétrograder "Content Hugging Priority - Vertical to 250"
Vous pouvez télécharger le code dans l'url suivante: https://github.com/jposes22/exampleTableCellCustomHeight
la source
Pour définir la dimension automatique pour la hauteur de ligne et la hauteur de ligne estimée, assurez-vous que les étapes suivantes sont effectives, la dimension automatique est efficace pour la disposition de hauteur de cellule / ligne.
UITableViewAutomaticDimension
à rowHeight et estimeRowHeightheightForRowAt
et lui renvoyer une valeurUITableViewAutomaticDimension
)-
Objectif c:
Rapide:
Pour l'instance d'étiquette dans UITableviewCell
Remarque : Si vous avez plusieurs étiquettes (UIElements) avec une longueur dynamique, qui doit être ajustée en fonction de la taille de son contenu: ajustez la `` Priorité à l'étirement du contenu et à la résistance à la compression '' pour les étiquettes que vous souhaitez développer / compresser avec une priorité plus élevée.
Ici, dans cet exemple, j'ai défini une priorité de résistance à la compression faible et élevée, ce qui conduit à définir plus de priorité / importance pour le contenu de la deuxième étiquette (jaune).
la source
Grâce à tous les articles sur ce sujet, il existe des moyens très utiles d'ajuster le rowHeight d'un UITableViewCell.
Voici une compilation de certains des concepts de tout le monde qui aide vraiment lors de la construction pour iPhone et iPad. Vous pouvez également accéder à différentes sections et les ajuster en fonction des différentes tailles de vues.
la source
Pour avoir la hauteur de cellule dynamique à mesure que le texte de Label augmente, vous devez d'abord calculer la hauteur, que le texte va utiliser dans la
-heightForRowAtIndexPath
méthode déléguée et la renvoyer avec les hauteurs ajoutées d'autres étiquettes, images (hauteur maximale du texte + hauteur des autres éléments statiques) composants) et utiliser la même hauteur dans la création de cellules.la source