13 votes

Rétrécir automatiquement la largeur du contenu de la cellule UITableViewCell

J'ai un peu de code qui crée une cellule de tableau avec un curseur. C'est assez simple et cela s'adapte bien à la taille de l'iPhone. Je l'ai un peu rendu anonyme ici :

UITableViewCell* cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier=" Foo "] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
CGRect contentViewFrame = cell.contentView.frame;
CGRect sliderFrame = CGRectMake(10, 0, 280, contentViewFrame.size.height);
UISlider* slider = [[UISlider alloc] initWithFrame:sliderFrame];
UIImage* minimumImage = [UIImage imageNamed="min.png"];
UIImage* maximumImage = [UIImage imageNamed="max.png"];
slider.minimumValueImage = minimumImage;
slider.maximumValueImage = maximumImage;
slider.value = 0.5f;
[slider addTarget=self action=@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview=slider];
[slider release];

Bien sûr, cela est dimensionné de manière incorrecte pour l'iPad. Alors ma première pensée a été de définir la propriété autoresizingMask sur UIViewAutoresizingFlexibleWidth. Problème résolu, non? Non. Maintenant, sur l'iPhone, la largeur du contenu du curseur plus des images est inférieure à 280 et il n'atteint donc pas tout à fait la fin - il se retrouve à environ 20 pixels de moins.

Sur l'iPad, c'est la même chose - la largeur du UISlider se redimensionne automatiquement à environ 20 pixels de moins que la fin de la cellule.

Peut-être que le drapeau de redimensionnement automatique tient compte de l'accessoryView inexistant de la cellule? J'ai essayé de le définir explicitement sur nil, mais je pense qu'il est par défaut à nil, donc rien n'a changé.

J'aimerais que le contenu de cette cellule se redimensionne automatiquement pour être la largeur "complète" de la cellule, indépendamment de l'appareil et de l'orientation. Existe-t-il un moyen facile de faire cela?

10voto

bioffe Points 3486

Cela fonctionne exactement comme vous l'avez décrit. Je suis porté à croire que c'est un bug iOS. Sur iPad, lorsque vous créez une nouvelle UITableViewCell, sa largeur est définie sur 320. codée en dur(!) à la fois la vue et le contenu. Elle ne se redimensionne pas correctement si vous la définissez sur UIViewAutoresizingFlexibleWidth. Je l'avais définie sur la moitié de la largeur de view.frame.size.width avec des résultats étranges : sur iPhone, c'est 160, sur iPad, c'est 608!!!

J'ai fini par redimensionner manuellement mes cellules et leur contenu.

6voto

Seega Points 1682

Un peu tard mais j'ai trouvé la solution à la même question aujourd'hui, mais vous devez créer une UITableViewCell personnalisée. Ensuite, vous pouvez écraser la fonction

- (void) layoutSubviews
{
    [dateLabel setFrame:CGRectMake(10.f, 16.f, 80.f, 12.f)];
    [textLabel setFrame:CGRectMake(106.f, 16.f, contentView.frame.size.width-105.f + 1.f, 12.f)];
}

Dans cette fonction, self.frame.size.width est l'actuel.
Et ça fonctionne aussi avec la rotation de l'appareil.

3voto

Vous devriez pouvoir indiquer au système de redimensionnement de "coller" un objet à une distance fixe du bord droit (lorsqu'il ne redimensionne pas assez loin). Si vous expérimentez avec IB, vous pouvez créer une vue qui se redimensionne en largeur et est fixée au côté droit.

Avez-vous également défini UIViewAutoresizingFlexibleRightMargin ?

3voto

Steven Fisher Points 22249

Définissez le contentMode de votre cellule sur UIViewContentModeRedraw.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X