web-dev-qa-db-fra.com

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

Je travaille dessus depuis environ 2 jours, alors je pensais partager mes apprentissages avec vous.

La question qui se pose est la suivante: est-il possible de réduire la largeur d’une cellule dans un UITableView groupé?

La réponse est non.

Mais vous pouvez contourner ce problème de deux manières.

Solution n ° 1: Une table plus fine Il est possible de changer le cadre de la tableView pour que la table soit plus petite. Cela donnera à UITableView le rendu de la cellule à l'intérieur avec 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 n ° 2: avoir des cellules rendues par des images

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

J'espère que cette information te sera utile. Il m'a fallu environ 2 jours pour essayer beaucoup de possibilités. C'est ce qui restait.

106
Tomen

Une méthode plus efficace et plus efficace consiste à sous-classer UITableViewCell et à redéfinir sa méthode -setFrame: comme suit:

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

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

  1. Ajustez la largeur de la vue tableau dans -viewWillAppear:

    Tout d’abord, cela n’est pas fiable, le contrôleur de vue parent ou superview peut ajuster le cadre de la vue tableau après l’appel de -viewWillAppear:. Bien sûr, vous pouvez sous-classer et remplacer -setFrame: pour votre UITableView, comme ce que je fais ici pour UITableViewCells. Cependant, sous-classer UITableViewCells est une méthode beaucoup commune, légère et Apple.

    Deuxièmement, si votre UITableView a backgroundView, vous ne voulez pas que son backgroundView soit réduit ensemble. Garder la largeur de backgroundView tout en réduisant la largeur de UITableView n'est pas un travail trivial, sans compter que développer des sous-vues au-delà de sa vue d'ensemble n'est pas une chose très élégante à faire.

  2. Rendu de cellule personnalisé pour simuler une largeur plus étroite

    Pour ce faire, vous devez préparer des images d’arrière-plan spéciales avec des marges horizontales, et vous devez disposer vous-même des sous-vues de cellules afin de les adapter aux marges . les travaux pour vous.

225
an0

Pour ce faire, dans Swift, qui ne fournit pas de méthodes pour définir les variables, vous devez remplacer le paramètre de configuration pour frame. Initialement posté (au moins où je l'ai trouvé) ici

override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        let inset: CGFloat = 15
        var frame = newFrame
        frame.Origin.x += inset
        frame.size.width -= 2 * inset
        super.frame = frame
    }
}
12
JuJoDi

Si rien ne fonctionne, vous pouvez essayer ceci

Définissez la couleur d'arrière-plan de la cellule comme une 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 également la couleur d'arrière-plan de l'étiquette sur la couleur d'arrière-plan.

9
includeMe

J'ai trouvé que la solution acceptée ne fonctionnait pas lors de la rotation. Pour atteindre UITableViewCells avec des largeurs fixes et des marges flexibles, je viens d'adapter la solution ci-dessus à la suivante:

- (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 le périphérique tourne, les cellules seront toujours centrées.

8
Graham

Il existe une méthode appelée lors de la rotation de l'écran: viewWillTransitionToSize

C'est ici que vous devez redimensionner le cadre. Voir exemple. Modifiez les paramètres du cadre selon vos besoins.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        int x = 0;
        int y = 0;
        self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
    }];
}
0
Guy