web-dev-qa-db-fra.com

uitableviewcell textlabel trop long et repoussez l'étiquette de detailtext

Lorsque j'utilise UITableViewCellStyleValue1, j'ai une longue chaîne de textLabel et, d'une manière ou d'une autre, le detailTextLabel a reçu Push de la vue.

Quand j'ai raccourci mon texte textLabel, alors je peux voir le texte de detailTextLabel.

Est-il possible de limiter la largeur de textLabel dans le style ci-dessus afin qu'il tronque le textLabel trop long?

Mon code est:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

}

cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;

//---get the letter in each section; e.g., A, B, C, etc.---
NSString *alphabet = [self.currencyNameIndex objectAtIndex:[indexPath section]];

//---get all states beginning with the letter---
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
self.currencyList = [self.keyCurrencyName filteredArrayUsingPredicate:predicate];

if ([self.currencyList count] > 0) 
{
    NSString *currencyName = [self.keyCurrencyName objectAtIndex:indexPath.row];
    cell.textLabel.text = currencyName;

    NSString *currencyCode = [self.valueCurrencyCode objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = currencyCode;

}   

return cell;
}

donc mon nom de devise sera long sur une entrée.

27
lucas

Le plus simple pour moi était de sous-classer UITableViewCell et de remplacer les layoutSubviews.

Impossible de trouver un moyen fiable de calculer les positions à partir des cadres d'étiquettes, il suffit donc de coder en dur la largeur de l'accessoire pour dans ce cas une cellule UITableViewCellStyleValue1 avec un type d'accessoire UITableViewCellAccessoryDisclosureIndicator.

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGFloat detailTextLabelWidth = [self.detailTextLabel.text sizeWithFont:self.detailTextLabel.font].width;
    CGRect detailTextLabelFrame = self.detailTextLabel.frame;

    if (detailTextLabelFrame.size.width <= detailTextLabelWidth && detailTextLabelWidth > 0) {
        detailTextLabelFrame.size.width = detailTextLabelWidth;
        CGFloat accessoryWidth = (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) ? 28.0f : 35.0f;
        detailTextLabelFrame.Origin.x = self.frame.size.width - accessoryWidth - detailTextLabelWidth;
        self.detailTextLabel.frame = detailTextLabelFrame;

        CGRect textLabelFrame = self.textLabel.frame;
        textLabelFrame.size.width = detailTextLabelFrame.Origin.x - textLabelFrame.Origin.x;
        self.textLabel.frame = textLabelFrame;
    }
}
15

@ Jhaliya @lucas 

cell.textLabel.numberOfLines = 3; // set the numberOfLines
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;

voir ici: Custom UITableViewCell. Échec de l'application de UILineBreakModeTailTruncation

6
c0ming

J'ai eu le même problème et j'ai dû créer un UITableViewCell sous-classe. C'est plus facile à faire que je le pensais:

Fondamentalement, il suffit de créer un nouveau fichier, qui est une sous-classe de UITableViewCell

Ajoutez les étiquettes et synthétisez-les:

// in the .h file
@property (nonatomic, weak) IBOutlet UILabel *textLabel;
@property (nonatomic, weak) IBOutlet UILabel *detailTextLabel;
// in the .m file
@synthesize textLabel, detailTextLabel;

Dans le StoryBoard, définissez votre classe comme classe de la cellule, définissez le style "Personnalisé" et ajoutez deux étiquettes dans la cellule pour qu'elles soient exactement comme vous le souhaitez (je leur ai donné le même aspect que celui par défaut: http: // cl. ly/J7z3 )

La partie la plus importante est de vous assurer de connecter les étiquettes à la cellule

Vous devez cliquer en maintenant la touche Contrôle enfoncée de la cellule vers l'étiquette dans le plan du document. Voici une image de ce à quoi il ressemble: http://cl.ly/J7BP

Ce qui m'a aidé à comprendre comment créer des cellules personnalisées, des cellules dynamiques et des cellules statiques, c'est cette vidéo sur youtube: http://www.youtube.com/watch?v=fnzkcV_XUw8

Une fois que vous faites cela, vous devriez être prêt. Bonne chance!

3
Flaviu

J'ai rencontré un problème similaire en essayant d'utiliser "Right Detail" dans UITableView; L'étiquette de titre intégrée aux détails de droite entachait mon étiquette de sous-titre.

Finalement, j'ai abandonné le "Right Detail" au profit de mon propre custom (en utilisant Swift et autolayout):

  1. J'ai créé ma propre classe simple qui hérite de UITableViewCell: 

    class TransactionCell: UITableViewCell
    {
    
    }
    
  2. Pour définir ma cellule prototype, utiliser cette classe personnalisée en définissant le champ "Style" sur "Personnalisé" dans le menu "Cellule d'affichage du tableau" et en ajoutant "TransactionCell" au champ "Classe" du menu "Classe personnalisée". Ces menus sont disponibles lorsque vous sélectionnez la cellule prototype dans le storyboard.  enter image description here  enter image description here

  3. J'ai ajouté deux étiquettes à ma cellule prototype et les ai connectées à ma classe personnalisée en faisant glisser un clic droit de mes étiquettes vers ma classe (Bizarrement, j'ai dû nettoyer ma construction avant de pouvoir le faire):

    class TransactionCell: UITableViewCell{
    
        @IBOutlet weak var detailsLabel: UILabel!
    
        @IBOutlet weak var amountLabel: UILabel!
    
    }
    
  4. J'ai ajouté de nouvelles contraintes à mes étiquettes, en tirant parti des fonctionnalités de rappel automatique de Swift (vous devrez les configurer pour qu'elles correspondent à vos propres besoins; consultez un tutoriel sur le transfert automatique si vous êtes bloqué).

 How to add new constraints: click on the thing to add constraints to then click on this symbol

  1. ... et définissez les champs "Lignes" et "Sauts de ligne" dans les menus "Etiquette" respectifs de manière à ce que l'espacement entre les étiquettes soit uniforme et que mon étiquette de détails puisse passer à plusieurs lignes.  enter image description here

Cela a fonctionné pour moi, me permettant d’avoir la flexibilité de différentes quantités de plusieurs lignes dans une UITableView dans Swift par cellule, tout en formatant l’habillage Word de façon à ce qu’il ait l’air agréable et même, comme je l’aurais attendu, comme le "Bon Détail" automatiquement 

2
Robert Hyatt

Ajustez le cadre de la vue: textLabel 

 CGRect aFrame = cell.textLabel.frame;
 aFrame.size.width = 100;  // for example
 cell.textLabel.frame = aFrame;
1
Rayfleck

Mise à jour de la réponse de Gosoftworks Development.

Swift 3

class BaseTableViewCell: UITableViewCell {
    override func layoutSubviews() {
        super.layoutSubviews()

        guard let tl = textLabel, let dl = detailTextLabel else { return }
        if (tl.frame.maxX > dl.frame.minX) {
             tl.frame.size.width = dl.frame.minX - tl.frame.minX - 5        
        }
    }
}

Ça marche!! Mais je viens de changer le code de Christopher King:

- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font :(NSString*) result
{

    while ([result sizeWithFont:font].width > width)
    {
        result = [result stringByReplacingOccurrencesOfString:@"..." withString:[NSString string]];

        result = [[result substringToIndex:([result length] - 1)] stringByAppendingString:@"..."];
    }

    return result;
}

et utilisation:

NSString* text = @"bla bla bla some long text bla bla";
text = [self stringByTruncatingToWidth:cell.frame.size.width-70.0 withFont:[UIFont systemFontOfSize:17] :text];
cell.textLabel.text = text;
0
Alexandr Tutkevich

1er: définir le mode de saut de ligne

textLabel.lineBreakMode = NSLineBreakByTruncatingTail;

2e: définissez la largeur de trame texLabel souhaitée (par exemple 200)

CGRect textFrame = self.textLabel.frame;
CGRect newTextFrame = CGRectMake(textFrame.Origin.x, textFrame.Origin.y, 200, textFrame.size.height);
self.textLabel.frame = newTextFrame;
0
RemembranceNN

Créez une UITableViewCell personnalisée contenant un UILabel que vous pouvez contrôler à votre guise, ou tronquez le texte que vous affectez au textLabel de la classe de base pour l'adapter à l'espace dont vous disposez.

Ce n'est pas parfait, mais j'ai utilisé la technique de troncature de texte dans des endroits où une cellule personnalisée est surchargée (par exemple, lorsque le seul problème consistait à intégrer le texte) en utilisant une catégorie NSString avec une méthode similaire à celle-ci:

- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font
{
    NSString *result = [NSString stringWithString:self];

    while ([result sizeWithFont:font].width > width)
    {
        result = [result stringByReplacingOccurrencesOfString:@"..." withString:[NSString string]];

        result = [[result substringToIndex:([result length] - 1)] stringByAppendingString:@"..."];
    }

    return result;
}

Probablement pas "optimisé" mais cela fonctionne pour des scénarios simples.

0
Christopher King

J'ai eu beaucoup de mal avec cela et j'ai trouvé une réponse assez simple. Ma textLabel était à gauche et repoussait la detailText à droite au point que vous ne la voyiez pas du tout parfois.

Ma solution, remplacez Table View Cellstyle par Subtitle de Left Detail ou Right Detail. Cette solution fonctionne si votre detailText ne vous dérange pas d'être en bas au lieu d'être à droite ou à gauche. 

Si vous rencontrez des problèmes avec la hauteur de la ligne, vous pouvez régler cela à l'aide du code ci-dessous dans viewDidLoad.

    self.tableView.estimatedRowHeight = 500 // set this as high as you might need, although I haven't tested alternatives
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.reloadData()
0
Craig.Pearce