8
votes

Comment créer une cellule de table multiligne dans iOS?

Comment puis-je obtenir la deuxième cellule pour se développer pour s'adapter au texte plutôt que d'augmenter le texte? Y a-t-il une façon de faire cela dans IOS ou devrai-je proposer une solution cuisinée à la maison? Si vous regardez dans l'application IOS Contacts, il existe une boîte comme celle-ci pour l'adresse. Je ne trouve pas comment implémenter cela.

Screenshot de table P>


pour que quiconque cherche à y parvenir à l'avenir, Voici le code de ma solution: P>

Fichier d'en-tête: P>

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

    if (indexPath.section == 0 && indexPath.row == 1) {

        NSString *text = [atmAnnotation address];

        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
        NSLog(@"Size for address is Height:%f Width:%f",size.height,size.width);

        CGFloat height = MAX(size.height, 44.0f);

        return height + (CELL_CONTENT_MARGIN * 2);  

    }
    return 44.0f;
}


0 commentaires

4 Réponses :


1
votes

Mise en œuvre: xxx

dans votre délégué de table. Pour la ligne et la section différente de l'index passe, renvoyez une hauteur différente pour s'adapter à votre étiquette.

Assurez-vous "Ajuster à l'ajustement" pour que l'étiquette IB n'est pas cochée (propriété ajustfontSizeofitofitwidth Si c'est terminé à l'aide du code).


0 commentaires

1
votes

Où vous avez l'adresse en tant que détailTextLabel, utilisez un Uilabel qui prend en charge autant de lignes que nécessaire, pour une adresse, 3 devraient suffire. Avec Paul Brent's < / code> réponse, vous devriez être prêt à partir.


0 commentaires

5
votes

Malheureusement, vous allez devoir mettre en œuvre cette fonctionnalité vous-même. Il existe une variété de méthodes et de rappel que vous devez utiliser pour calculer la hauteur des rangées et des étiquettes. Si vous avez besoin d'aide pour commencer, je peux modifier cette réponse pour inclure un exemple de code. Sinon, je suis sûr qu'il y a des questions connexes ici sur SO ou Google qui peuvent vous aider à démarrer. En résumé, cependant:

  • Déterminez la hauteur de la ligne dans la méthode méthode -TableView: HauteurFornorDindexpath: . Vous aurez probablement besoin d'utiliser Uikit Nstring Méthodes d'addition Pour calculer la taille de votre chaîne avec une taille de police donnée, etc. Retournez la hauteur appropriée de cette méthode de déléguée.
  • Assurez-vous que votre étiquette (IB ou configuré par programme par programme) est définie pour utiliser plusieurs lignes. Si vous définissez Numberflines sur 0, l'étiquette utilisera autant de lignes que nécessaire.
  • Dans votre UitailViewAsource Implémentation de -TableView: Cellfrowrowindexpath: , vous devez utiliser la même logique qu'avant pour déterminer le cadre de vos étiquettes. Définissez le texte que vous souhaitez, puis modifiez le cadre de sorte que l'étiquette soit suffisamment grande pour simplement adapter tout le texte.

0 commentaires

0
votes

Je viens de courir dans ce même problème. J'ai trouvé une solution alternative qui ne nécessite pas tout autant de codage dur et vous permet de modifier l'étiquette dans le constructeur d'interface qui sera reflété dans le calcul de la hauteur.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
     if (indexPath.section == 0 && indexPath.row == 1) {
        NSString *text = [atmAnnotation address];
        UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

        cell.textLabel.text = text;
        [cell.textLabel sizeToFit];

        CGFloat height = MAX( 44, cell.textLabel.bounds.size.height );

        return height + CELL_CONTENT_MARGIN * 2;
    }

    return 44.0f;
}


0 commentaires