2010-08-23 3 views
6

Je suis essayer d'émuler quelque chose comme la page "nouveau message" dans l'application de messagerie d'Apple sur l'iphone. Je l'ai implémenté avec une tableview et j'ai réussi à avoir les lignes "To", "CC", et "Sujet" pour se comporter correctement, mais je ne suis pas sûr de savoir comment implémenter la portion de message de la page.Comment créer une cellule de table à redimensionnement automatique pour saisir des textes comme dans l'application "mail" de l'iPhone?

J'ai plusieurs problèmes. J'essaye actuellement de l'implémenter en plaçant un UITextView dans la cellule (j'éteins les barres de défilement sur la vue de texte). J'ai l'affichage de texte se redimensionner quand il est changé, en modifiant son cadre à la nouvelle hauteur du contenu. Le premier problème est que j'ai aussi besoin de faire cela pour la hauteur de la cellule elle-même. Comme heightForRowAtIndexPath ne semble être appelé que lorsque la ligne est chargée pour la première fois, je ne peux pas en modifier la hauteur. Je suppose que je pourrais appeler des données de rechargement sur la table, mais il semble que ce serait vraiment inefficace sur toute la table à chaque fois que le texte est entré. Quel est le meilleur moyen de réinitialiser la cellule de table en fonction de l'utilisateur? J'ai trouvé beaucoup d'exemples sur la façon de le faire sur les vues de tables solitaires et comment redimensionner les cellules de la table à l'initialisation, mais je ne peux pas en trouver qui vous permettent de faire les deux en même temps. Enfin, je voudrais que la bordure inférieure de la cellule du tableau soit invisible. Si vous regardez l'application de messagerie, vous remarquerez qu'il n'y a pas de ligne au bas de l'espace de message, ce qui implique que vous pouvez continuer à taper. J'en ai toujours un dans ma vue de table (même quand j'ajoute un pied de page) et je n'arrive pas à comprendre comment m'en débarrasser. (Peut-être devrais-je faire de mon corps de message le pied de page lui-même?)

Répondre

3

Je vous recommande d'utiliser UIScrollView vous-même au lieu d'UITableView. UITableView n'est pas vraiment conçu pour supporter une telle chose.

2

Mail.app ne semble pas utiliser UITableView. Il ressemble à des éléments personnalisés (étiquettes et champs de texte) avec UITextView en bas.

+0

Et, j'ai oublié - tout est fini UIScrollView. –

1

Vous pouvez essayer ma réponse à une question similaire à celle ... la clé est d'utiliser

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

Pour ce faire, sans recharger les données. Tout d'abord, bien sûr, vous allez vouloir créer votre UITextView et l'ajouter au contentView de votre cellule. J'ai créé une variable d'instance de UITextView appelé « cellTextView » Voici le code que je:

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

Ensuite, créez une variable int appelé NumberOfLines et définir la variable à 1 dans votre méthode init. Par la suite, dans votre méthode de textViewDidChange textViewDelegate, utilisez ce code:

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

Enfin, collez ce code dans votre méthode de heightForRowAtIndexPath:

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