108 votes

Comment définir la largeur d'une cellule dans un UITableView dans un style groupé

J'ai travaillé sur cette question depuis environ 2 jours, j'ai donc pensé que je partage mes connaissances acquises avec vous.

La question est: Est-il possible de faire de la largeur d'une cellule dans un groupe de UITableView plus petits?

La réponse est: Non.

Mais il y a deux façons que vous pouvez contourner ce problème.

Solution #1: Une diminution de l'épaisseur de la table Il est possible de changer l'image de la tableView, de sorte que la table sera plus petite. Cela entraînera une UITableView rendu de la cellule à l'intérieur de la largeur réduite.

Une solution pour cela peut ressembler à ceci:

-(void)viewWillAppear:(BOOL)animated
{
    CGFloat tableBorderLeft = 20;
    CGFloat tableBorderRight = 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
    tableView.frame = tableRect;
}

Solution #2: Avoir des cellules rendues par les images

Cette solution est décrite ici: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

J'espère que cette information est utile pour vous. Il m'a fallu environ 2 jours à essayer un tas de possibilités. C'est ce qu'a gauche.

228voto

an0 Points 4900

Une meilleure et plus propre façon d'atteindre cet objectif est sous-classement UITableViewCell et surchargeant ses -setFrame: méthode comme ceci:

- (void)setFrame:(CGRect)frame {
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

Pourquoi est-il mieux? Parce que les deux autres sont pires.

  1. Ajuster la vue de la table largeur en -viewWillAppear:

    Tout d'abord, ce n'est pas fiable, le superview ou parent-vue-contrôleur peut ajuster la vue de la table de cadre après l' -viewWillAppear: est appelé. Bien sûr, vous pouvez sous-classe et de remplacer -setFrame: pour votre UITableView, tout comme ce que je fais ici pour UITableViewCells. Toutefois, le sous-classement UITableViewCells est un bien commun, de la lumière, et Apple.

    Deuxièmement, si votre UITableView ont backgroundView, vous ne voulez pas que sa backgroundView être rétréci vers le bas ensemble. En gardant backgroundView largeur tout en bas étroit UITableView largeur n'est pas trivial de travail, pour ne pas mentionner le fait que l'expansion des sous-vues au-delà de ses superview n'est pas très élégante, une chose à faire en premier lieu.

  2. De cellule personnalisé rendu à faux une largeur plus étroite

    Pour ce faire, vous devez préparer les images de fond avec des marges horizontales, et vous avez à disposition des sous-vues de cellules-vous pour accueillir les marges. En comparaison, si vous il suffit de régler la largeur de la cellule entière, d'un redimensionnement automatique va faire tous les travaux pour vous.

9voto

dsc Points 1330

Si rien ne fonctionne, vous pouvez essayer ceci

Rendez la couleur d'arrière-plan de la cellule en couleur claire, puis placez une image de la cellule avec la taille requise. Si vous souhaitez afficher du texte sur cette cellule, placez une étiquette au-dessus de l'image. N'oubliez pas de définir la couleur d'arrière-plan de l'étiquette également pour effacer la couleur.

9voto

Graham Points 3509

J'ai trouvé que la solution acceptée ne fonctionnait pas en rotation. Pour obtenir UITableViewCells avec des largeurs fixes et des marges flexibles, je viens d’adapter la solution ci-dessus aux suivantes:

 - (void)setFrame:(CGRect)frame {

if (self.superview){
    float cellWidth = 500.0;
    frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
    frame.size.width = cellWidth;
}

[super setFrame:frame];
}
 

La méthode est appelée à chaque fois que l'appareil tourne, de sorte que les cellules seront toujours centrées.

-6voto

Dans le fichier .h, ajoutez le délégué 'UITableViewDataSource'

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

return size;

}
 

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