32 votes

Comment déterminer la marge d'un UITableView groupé (ou mieux, comment le définir)?

Le UITableView groupé place une marge entre le bord de la vue et les cellules du tableau. De façon ennuyeuse (pour moi), cette marge est fonction de la largeur de la vue.

Dans mon application, j'ai deux UITableViews de différentes largeurs que je cherche à aligner les bords des cellules.

Est-il possible d'obtenir cette marge? Ou mieux est-il possible de fixer cette marge?

cheers, --Ben

54voto

Matthew Thomas Points 529

Largeur de TableView groupée par rapport à la marge de cellule

TBWidth (0 à 20) Marge gauche = TBWidth - 10

TBWidth (20 à 400) Marge gauche = 10

TBWidth (401 à 546) Marge gauche = 31

TBWidth (547 à 716) Marge gauche = environ 6% du tableau

TBWidth (717 à 1024) Marge gauche = 45

 - (float) groupedCellMarginWithTableWidth:(float)tableViewWidth
{
    float marginWidth;
    if(tableViewWidth > 20)
    {
        if(tableViewWidth < 400)
        {
            marginWidth = 10;
        }
        else
        {
            marginWidth = MAX(31, MIN(45, tableViewWidth*0.06));
        }
    }
    else
    {
        marginWidth = tableViewWidth - 10;
    }
    return marginWidth;
}
 

18voto

Steven Kramer Points 6122

En créant (et en utilisant!) Une sous-classe de UITableViewCell, vous pouvez éventuellement réaliser ce que vous recherchez. Déplacez simplement la vue de contenu et la vue d'arrière-plan dans les présentations sous-vues, comme dans l'exemple de code ci-dessous qui déplace les parties visibles de la cellule de 20 points vers la droite.

 - (void) layoutSubviews
{
    NSLog (@"Cell/contentview/backgroundview before:\n%@\n%@\n%@", self, self.contentView, self.backgroundView);
    [super layoutSubviews];
    CGRect frame = self.backgroundView.frame;
    frame.origin.x += 20;
    frame.size.width -= 20;
    self.backgroundView.frame = frame;
    frame = self.contentView.frame;
    frame.origin.x += 20;
    frame.size.width -= 20;
    self.contentView.frame = frame;

    NSLog (@"Cell/contentview/backgroundview after:\n%@\n%@\n%@", self, self.contentView, self.backgroundView);
}
 

12voto

daveoncode Points 4453

J'ai été à l'aide de Matthew Thomas mise en œuvre, mais il est peu fiable (il est cassé, si vous utilisez un atterrissage en autorotation dans vos contrôleurs) et a beaucoup de codée en dur dans le code... j'ai réalisé qu'il y a une solution très simple, mon application est une seule ligne de code:

- (float)cellMargins
{
    return self.backgroundView.frame.origin.x * 2;
}

C'est beaucoup mieux de l'OMI :)

EDIT: mon œuvre était peu fiable, trop (il ne fonctionne pas correctement lors du passage en mode d'édition), c'est mon final de mise en œuvre (j'ai manipulé à droite et à gauche des marges séparément):

- (float)leftMargin
{
    return self.contentView.frame.origin.x;
}

- (float)rightMargin
{
    CGRect frame = self.contentView.frame;
    float containerWidth = frame.size.width;
    float margin = self.frame.size.width - (containerWidth + frame.origin.x);
    return margin;
}

- (float)cellMargins
{
    return ([self leftMargin] + [self rightMargin]);
}

6voto

tt.Kilew Points 2136

Mise à jour du code de Matthew Thomas pour le calcul des marges des cellules. Créé via la catégorie UITableView. Cela peut être utile lorsque vous devez déterminer la hauteur du texte dans la cellule et que vous ne connaissez pas la largeur de cette cellule.

Ainsi, la cellule réelle peut être calculée comme

 cell.width = tableView.width - tableView.cellsMargin * 2;
 

Et voici le code

 @implementation UITableView (CellsMargins)

// This is black magic
// from
// http://stackoverflow.com/questions/4708085/how-to-determine-margin-of-a-grouped-uitableview-or-better-how-to-set-it

- (CGFloat)cellsMargin {

   // No margins for plain table views
   if (self.style == UITableViewStylePlain) {
      return 0;
   }

   // iPhone always have 10 pixels margin
   if (! isIPad()) {
      return 10;
   }

   CGFloat tableWidth = self.frame.size.width;

   // Really small table
   if (tableWidth <= 20) {
      return tableWidth - 10;
   }

   // Average table size
   if (tableWidth < 400) {
      return 10;
   }

   // Big tables have complex margin's logic
   // Around 6% of table width,
   // 31 <= tableWidth * 0.06 <= 45

   CGFloat marginWidth  = tableWidth * 0.06;
   marginWidth = MAX(31, MIN(45, marginWidth));
   return marginWidth;
}

@end
 

1voto

The Rat Points 705

Marge gauche plus précise pour la zone «extensible» au lieu de «apx». 6% calc. »

Note latérale: l'iPad met en œuvre un rembourrage supplémentaire en haut et en bas de la section en plus du rembourrage de la marge gauche, il est inférieur de 10,0f à la largeur de la table de 400,0f et de 31,0f dans le cas contraire.

 -(CGFloat)leftMarginForTableView:(UITableView*)tableView
{
    if (tableView.style != UITableViewStyleGrouped) return 0;
    CGFloat widthTable = tableView.bounds.size.width;
    if (isPhone)              return (10.0f);
    if (widthTable <= 400.0f) return (10.0f);
    if (widthTable <= 546.0f) return (31.0f);
    if (widthTable >= 720.0f) return (45.0f);
    return (31.0f + ceilf((widthTable - 547.0f)/13.0f));
}
 

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