Eh bien, celui-ci m'a coûté un après-midi, mais je pense que je l'ai compris. Autant que je sache, cela semble être un bug dans la façon dont UITableViewCell est en train de mettre en page textLabel et detailTextLabel. Lorsque vous définissez la hauteur de ligne, il semble attribuer une hauteur égale aux deux étiquettes, ce qui signifie que vous obtenez exactement le comportement que vous voyez ci-dessus, même si detailTextLabel a besoin de plus d'espace. Voici les deux choses que j'ai faites pour résoudre le problème. J'ai dû sous-classer UITableViewCell pour le réparer, mais c'est une quantité minimale de code. Tout d'abord, assurez-vous de calculer correctement la hauteur de chaque rangée. Mettez cette méthode dans votre délégué de vue de table. Remettez en place les méthodes de police avec votre propre:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellDetailText = [[self itemForIndexPath: indexPath] detailDescription];
NSString *cellText = [[self itemForIndexPath: indexPath] description];
// The width subtracted from the tableView frame depends on:
// 40.0 for detail accessory
// Width of icon image
// Editing width
// I don't think you can count on the cell being properly laid out here, so you've
// got to hard code it based on the state of the table.
CGSize constraintSize = CGSizeMake(tableView.frame.size.width - 40.0 - 50.0, CGFLOAT_MAX);
CGSize labelSize = [cellText sizeWithFont: [self cellTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
CGSize detailSize = [cellDetailText sizeWithFont: [self cellDetailTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
CGFloat result = MAX(44.0, labelSize.height + detailSize.height + 12.0);
return result;
}
Ensuite, la sous-classe UITableViewCell et passer outre layoutSubviews:
#import "UITableViewCellFixed.h"
@implementation UITableViewCellFixed
- (void) layoutSubviews {
[super layoutSubviews];
self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x,
4.0,
self.textLabel.frame.size.width,
self.textLabel.frame.size.height);
self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x,
8.0 + self.textLabel.frame.size.height,
self.detailTextLabel.frame.size.width,
self.detailTextLabel.frame.size.height);
}
@end
Il semble que le texte de votre sous-titre circule dans le bas de la cellule et dans le suivant, est-ce que c'est ce que je vois? Aussi, cela arrive-t-il sur l'appareil ou juste sur simulateur? – jbrennan
Pouvez-vous poster votre implémentation de heightForRowAtIndexPath? –
Belle touche avec la capture d'écran. –