Używam niestandardowego UITableViewCell, który ma pewne etykiety, przyciski i widoki obrazów do wyświetlenia. W komórce znajduje się jedna etykieta, której tekst jest NSString
obiektem, a długość łańcucha może być zmienna. Ze względu na to, że nie można ustawić wysokość stałej do komórki w UITableView
„s heightForCellAtIndex
metody. Wzrost komórki w zależności od wysokości etykiety, które mogą być określone przy użyciu NSString
„S sizeWithFont
metody. Próbowałem go użyć, ale wygląda na to, że gdzieś się mylę. Jak można to naprawić?
Oto kod użyty do zainicjowania komórki.
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];
}
To jest etykieta, której wysokość i szerokość są nieprawidłowe:
textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
źródło
Jeśli wszystkie wiersze mają tę samą wysokość, po prostu ustaw
rowHeight
właściwość UITableView zamiast implementowaćheightForRowAtIndexPath
. Dokumenty Apple:źródło
tableView.rowHeight
jest ustawiony,heightForRowAtIndexPath
nie będzie wywoływany, na wypadek, gdybyś próbował dowiedzieć się, dlaczego (tak jak ja).dodaj niestandardowy kontroler UITableViewCell
Dodaj to w sterowniku UITableView
źródło
źródło
źródło
Widziałem wiele rozwiązań, ale wszystko było złe lub niepełne. Możesz rozwiązać wszystkie problemy za pomocą 5 linii w viewDidLoad i autolayout. To dla objetive C:
W przypadku szybkiego 2.0:
Teraz stwórz swoją komórkę za pomocą xib lub w widoku tabeli w Storyboard Dzięki temu nie musisz nic więcej implementować ani zastępować. (Nie zapomnij o numerach linii 0) i obniżenie dolnej etykiety (ograniczenie) „Priorytet przytulania treści - w pionie do 250”
Możesz załadować kod w następnym adresie URL: https://github.com/jposes22/exampleTableCellCustomHeight
źródło
Aby ustawić automatyczny wymiar dla wysokości wiersza i szacowanej wysokości wiersza, wykonaj następujące kroki, aby automatyczny wymiar był skuteczny dla układu wysokości komórki / wiersza.
UITableViewAutomaticDimension
do rowHeight & oszacowanyRowHeightheightForRowAt
I zwracanie wartościUITableViewAutomaticDimension
do niego)-
Cel C:
Szybki:
Dla instancji etykiety w UITableviewCell
Uwaga : Jeśli masz więcej niż jedną etykietę (UIElements) o długości dynamicznej, którą należy dostosować do jej rozmiaru: Dostosuj „Priorytet przytulania zawartości i priorytetu odporności na ściskanie” dla etykiet, które chcesz rozwinąć / skompresować z wyższym priorytetem.
W tym przykładzie ustawiłem niski priorytet przytulania i wysoki priorytet odporności na kompresję, co prowadzi do ustawienia większego priorytetu / ważności dla zawartości drugiej (żółtej) etykiety.
źródło
Dzięki wszystkim postom na ten temat istnieje kilka naprawdę pomocnych sposobów dostosowania rowHeight UITableViewCell.
Oto kompilacja niektórych koncepcji od wszystkich innych, która naprawdę pomaga w budowaniu dla iPhone'a i iPada. Możesz także uzyskać dostęp do różnych sekcji i dostosować je do różnych rozmiarów widoków.
źródło
Aby dynamiczna wysokość komórki rosła wraz ze wzrostem tekstu Etykiety, musisz najpierw obliczyć wysokość, którą tekst będzie używał w
-heightForRowAtIndexPath
metodzie delegowania i zwrócić ją z dodanymi wysokościami innych etykiet, obrazów (maksymalna wysokość tekstu + wysokość innej wartości statycznej komponenty) i używaj tej samej wysokości do tworzenia komórek.źródło