2010-08-23 12 views
6

Próbuję emulować coś tak, jak strona "nowa wiadomość" w aplikacji pocztowej Apple na iPhonie. Zaimplementowałem go z widokiem tableview i pomyślnie otrzymałem wiersze "To", "CC" i "Subject", aby zachowywać się poprawnie, ale nie jestem pewien, jak zaimplementować rzeczywistą część wiadomości na stronie.W jaki sposób utworzyć automatycznie zmieniającą rozmiar komórkę tabeli do wprowadzania tekstów, np. W aplikacji "mail" na telefonie iPhone?

Mam kilka problemów. Obecnie próbuję go wdrożyć, umieszczając UITextView w komórce (wyłączam paski przewijania w widoku tekstowym). Zmieniłem widok tekstu podczas jego zmiany, modyfikując jego ramkę na nową wysokość zawartości. Pierwszym problemem jest to, że muszę to zrobić również dla samej wysokości komórki. Ponieważ heightForRowAtIndexPath wydaje się być wywoływana tylko wtedy, gdy wiersz jest ładowany po raz pierwszy, nie mogę zmienić wysokości tam. Przypuszczam, że mógłbym wezwać doładowanie danych na stole, ale wydaje się, że byłoby to naprawdę nieefektywne w przypadku całej tabeli przy każdym wprowadzaniu tekstu. Jaki jest najlepszy sposób, aby komórka tabeli automatycznie zmieniła typ użytkownika? Znalazłem wiele przykładów, jak to zrobić w pojedynczych widokach tabel i jak zmieniać rozmiar komórek tabeli podczas inicjalizacji, ale nie mogę znaleźć żadnego, który pozwoliłby na wykonanie obu tych czynności jednocześnie.

Wreszcie chciałbym, aby dolna krawędź komórki tabeli była niewidoczna. Jeśli spojrzysz na aplikację pocztową, zauważysz, że na dole miejsca na wiadomości nie ma linii, co oznacza, że ​​możesz dalej pisać. Zawsze mam jeden w widoku tabeli (nawet gdy dodaję stopkę) i nie mogę wymyślić, jak się go pozbyć. (Być może powinienem uczynić moje ciało wiadomości stopą samą?)

Odpowiedz

3

Polecam za pomocą UIScrollView siebie zamiast UITableView. UITableView nie jest tak naprawdę zbudowany, aby obsługiwać takie rzeczy.

2

Mail.app wydaje się nie używać UITableView. Wygląda na to, że istnieją niestandardowe elementy (etykiety i pola tekstowe) z UITextView na dole.

+0

A, zapomniałem - wszystko jest na UIScrollView. –

1

można spróbować moją odpowiedź na pytanie podobny do tego ... kluczem jest użycie

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

Aby to zrobić bez przeładowywania danych.

Po pierwsze, oczywiście, będziesz chciał stworzyć swój UITextView i dodać go do treści swojej komórki. Stworzyłem instancją zmienna UITextView zwany „cellTextView” Oto kod, który kiedyś:

- (UITableViewCell *)tableView:(UITableView *)tableView fileNameCellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 

    if (!cellTextView) { 
     cellTextView = [[UITextView alloc] initWithFrame:CGRectMake(5.0, 5.0, cell.bounds.size.width - 30.0, cell.bounds.size.height - 10.0)]; // I use these x and y values plus the height value for padding purposes. 
    } 
    [cellTextView setBackgroundColor:[UIColor clearColor]]; 
    [cellTextView setScrollEnabled:FALSE]; 
    [cellTextView setFont:[UIFont boldSystemFontOfSize:13.0]]; 
    [cellTextView setDelegate:self]; 
    [cellTextView setTextColor:[UIColor blackColor]]; 
    [cellTextView setContentInset:UIEdgeInsetsZero]; 
    [cell.contentView addSubview:cellTextView]; 

    return cell; 
} 

Następnie utwórz zmienną int zwane numberOfLines i ustawić zmienną do 1 w metodzie startowej. Następnie w metodzie textViewDidChange Twojego textViewDelegate, użyj tego kodu:

- (void)textViewDidChange:(UITextView *)textView 
{ 
    numberOfLines = (textView.contentSize.height/textView.font.lineHeight) - 1; 

    float height = 44.0; 
    height += (textView.font.lineHeight * (numberOfLines - 1)); 

    CGRect textViewFrame = [textView frame]; 
    textViewFrame.size.height = height - 10.0; //The 10 value is to retrieve the same height padding I inputed earlier when I initialized the UITextView 
    [textView setFrame:textViewFrame]; 

    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

    [cellTextView setContentInset:UIEdgeInsetsZero]; 
}  

Wreszcie, wklej ten kod do metody heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    float height = 44.0; 
    if (cellTextView) { 
     height += (cellTextView.font.lineHeight * (numberOfLines - 1)); 
    } 
    return height; 
} 
Powiązane problemy