2010-09-20 14 views
13

Ich habe eine UITextView in einer UITableViewCell contentview und erlauben der Zelle Autoresize, so dass der eingegebene Text vollständig angezeigt wird - was ich versuche zu erreichen ist eine Autoresizing Zelle wie die native iOS4 Kontakte App hat, wenn Sie "Notizen" für den Kontakt eingeben - dh wenn sich die contentSize des textView ändert - rufe ich reloadRowsAtIndexPaths auf und im delegate heightForRowAtIndexPath lege ich die neue Höhe für row an - das macht den Job, aber es ist nicht schön und glatt wie der Kontakt-App - Ich bin mir fast sicher, dass Apple einen nicht dokumentierten Trick in dieser App verwendet, um die contentView der Zelle glatt und animiert zu erweitern, ohne reloadRowsAtIndexPaths aufzurufen. Meine Frage ist, wie würden Sie vorschlagen, solche Funktionalität zu implementieren? Ich hoffe, ich habe keine Details in der Erklärung vermisst.UITextView in einer UITableViewCell glatte automatische Größenanpassung

+0

Haben Sie versucht UIView Animationen mit? Ich habe sie nie dafür benutzt, aber das könnte funktionieren. – Jukurrpa

+0

Ja, ich habe einige UIView-Animationen für den inneren Inhalt ausprobiert, es glättet den Prozess etwas, aber ich frage mich, ob es eine Möglichkeit gibt, reloadRowsAtIndexPaths nicht zu verwenden, anscheinend gibt es keine offengelegte Methode dafür. – justadreamer

Antwort

15

Versuchen Sie diesen Code unten, es wird Ihnen helfen. Sie müssen keine Reload-Funktionen wie reloadRowsAtIndexPaths verwenden.

// Textview Delegat

- (void)textViewDidChange:(UITextView *)textView { 
    if (contentView.contentSize.height > contentRowHeight) { 

    contentRowHeight = contentView.contentSize.height; 

    [theTableView beginUpdates]; 
    [theTableView endUpdates]; 

    [contentView setFrame:CGRectMake(0, 0, 300.0, contentView.contentSize.height)]; 
    } 
} 

// Tableview Delegat

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat height; 

    if (indexPath.row == 0) 
     height = kTitleRowHeight; 
    else 
     height = contentRowHeight; 

    return height; 
} 
+0

Was ist ContentView in diesem Code? Ich nehme an, es ist TextView? – justadreamer

+0

Das ist die Eigenschaft von UITableViewCell. UITextView wird in dieser Eigenschaft hinzugefügt. [cell.contentView addSubview: textView]; –

+0

Ich verwende diese Lösung in meiner App und es funktioniert 100% auf dem iPhone, aber auf dem iPad ist es nicht: wenn der Benutzer mehr als eine Textzeile eingibt, wird die 'UITableViewCell' größer, wie es soll , aber das 'UITextView' bewegt sich tatsächlich * nach oben *, so dass die erste Textzeile über dem oberen Rand von 'UITableViewCell' liegt - und versteckt. Irgendwelche Ideen, wie man das auf dem iPad löst? – Jason

11

fand ich den besten Weg, dies zu lösen.

Zunächst einmal, natürlich werden Sie Ihre UITextView erstellen und fügen Sie es in Ihre Zelle contentView. Ich habe eine Instanzvariable von UITextView "cellTextView" genannt Hier ist der Code, den ich verwenden:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(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; 
} 

Dann eine int Variable erstellen NumberOfLines genannt und die Variable auf 1 in der init-Methode. Danach in Ihrem textViewDelegate ‚s textViewDidChange Methode, diesen Code verwenden:

- (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]; 
}  

Schließlich fügen Sie diesen Code in Ihre heightForRowAtIndexPath Methode:

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

+1 Das funktioniert gut. –

+1

yep, das funktioniert super +1. Durch Speichern der numberOfLines in einem NSArray bei index = indexPath.row mit dem textView.tag, der auf indexPath.row festgelegt ist, werden außerdem mehrere UITextviews in vielen Zellen mit der Textgröße in jeder Zelle geändert. – Rambatino

+0

Danke! Und eine einfache Lösung wäre es, eine andere Möglichkeit zu finden, um festzustellen, welche textView-Datei die Größe ändern soll. Dieser Code wurde für die Arbeit mit einem TextView pro Zelle angepasst. –

Verwandte Themen