Tworzę UITableView
z różnymi typami UITableViewCell
w zależności od typu wyświetlanej treści. Jeden z to UITableViewCell
z wewnątrz UITextView
programowo utworzonego w ten sposób:Zwiększenie wysokości komórki widoku osobistego jednocześnie zwiększając wewnętrzną UITextView
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
if([current_field.tipo_campo isEqualToString:@"text_area"])
{
NSString *string = current_field.valore;
CGSize stringSize = [string sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = ([string isEqualToString:@""]) ? 30.0f : stringSize.height+10;
UITextView *textView=[[UITextView alloc] initWithFrame:CGRectMake(5, 5, 290, height)];
textView.font = [UIFont systemFontOfSize:15.0];
textView.text = string;
textView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
textView.textColor=[UIColor blackColor];
textView.delegate = self;
textView.tag = indexPath.section;
[cell.contentView addSubview:textView];
[textView release];
return cell;
}
...
}
Ponieważ widok tekst jest edytowalny komórka, która zawiera powinien zmienić jego wysokość, aby prawidłowo dopasować widoku tekst rozmiarów. Początkowo robiłem to przez zmianę rozmiaru UITextView
wewnątrz metody textViewDidChange
: w ten sposób:
- (void)textViewDidChange:(UITextView *)textView
{
NSInteger index = textView.tag;
Field* field = (Field*)[[self sortFields] objectAtIndex:index];
field.valore = textView.text;
[self.tableView beginUpdates];
CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;
newHeight = textView.contentSize.height;
[self.tableView endUpdates];
}
zapisać nową wysokość widoku tekstu w zmiennej, a następnie, gdy tableView:heightForRowAtIndexPath
: wywoływana jest metoda, zmianie rozmiaru komórkę w ten sposób:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
if ([current_field.tipo_campo isEqualToString:@"text_area"])
{
return newHeight +10.0f;
}
else
return 44.0f;
...
}
w ten sposób oba są przeskalowane, ale nie odbywa się w synchronizacji, czyli najpierw TextView
jest zmieniany, a następnie jest on zmieniany wysokość komórki, więc na chwilę użytkownikowi zobaczyć, że tekst widok jest większy niż komórka. Jak mogę naprawić to złe zachowanie?
Na razie znajduję ścieżkę ustawiającą tło uitextview do clearColor. Jest trasparent i błąd jest niewidoczny. – LuckyStarr
Everytime cellForRow ... zostaje wywołana, alokujesz, inicjalizujesz i dodajesz UITextView jako widok podrzędny. Dlaczego nie wykonać tej konfiguracji tylko raz, tworząc własną podklasę UITableViewCell? Wygląda na to, że sposób, w jaki to robisz spowodowałby problemy w wyniku dodania wielu UITextViews do komórki za każdym razem, gdy ta metoda zostanie wywołana, na przykład po ponownym wczytaniu danych. – ozz
@ cdo zauważyłem ten błąd, więc zmodyfikowałem kod. Jeśli komórka jest zerowa, tworzę UITextView, w przeciwnym razie odzyskuję ją jako wyeksponowanie komórki. – LuckyStarr