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.
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;
}
}
@ Jhaliya @lucas
cell.textLabel.numberOfLines = 3; // set the numberOfLines
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
voir ici: Custom UITableViewCell. Échec de l'application de UILineBreakModeTailTruncation
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!
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):
J'ai créé ma propre classe simple qui hérite de UITableViewCell:
class TransactionCell: UITableViewCell
{
}
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.
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!
}
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é).
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
Ajustez le cadre de la vue: textLabel
CGRect aFrame = cell.textLabel.frame;
aFrame.size.width = 100; // for example
cell.textLabel.frame = aFrame;
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;
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;
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.
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 Cell
style
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()