2010-09-15 4 views
8

J'ai sous-classé UITableViewCell pour créer une cellule personnalisée avec un bouton et 2 étiquettes. La définition de cellule est chargée à partir d'un xib en utilisant le modèle décrit dans Beginning iPhone Development de Dave Mark. Voici le code essentiel:Impossible d'indenter UITableViewCell sous-classe

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MarketItemCustomCell" owner:self options:nil]; 

    for (id oneObject in nib) 
    { 
     if ([oneObject isKindOfClass:[MarketItemCustomCell class]]) 
     { 
      cell = (MarketItemCustomCell *)oneObject; 
      break; 
     } 
    } 

Les étiquettes et le bouton s'affichent comme prévu mais le niveau d'indentation n'est pas respecté. J'ai implémenté indentationLevelForRowAtIndexPath comme ci-dessous, mais la cellule est toujours alignée tout le chemin vers la gauche.

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     <snip/> 
     return 5; 
    } 

Notez que le niveau d'indentation fonctionne correctement lorsque je n'utilise pas de cellule personnalisée.

Des indices?

Répondre

21

Mise à jour pour iOS 8: Le code ci-dessous ne fonctionne plus pour une raison quelconque

autre suggestion pour iOS 8:

Envisagez de créer une contrainte de mise en page automatique pour représenter la marge gauche indenter

Lors de l'exécution, modifier cette contrainte au changement le niveau de retrait

Si vous avez une sous-classe UITableViewCell personnalisée, cette sous-classe peut avoir un objet IBOutlet mappé à la contrainte. (Malheureusement, Apple n'a pas fourni de fonction findConstraintByTag/Id)

La propriété "constant" ironiquement nommée de NSLayoutConstraint peut être modifiée pour modifier le niveau de retrait.

Pour iOS 7, cela fonctionne (mais ne devrait plus être recommandé)

Basé sur la suggestion de vodkhang, je mis en œuvre la solution suivante dans mon UITableViewCell sublass. Je ne sais pas si c'est la meilleure solution, mais il semble bien fonctionner.

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    float indentPoints = self.indentationLevel * self.indentationWidth; 

    self.contentView.frame = CGRectMake(indentPoints, 
              self.contentView.frame.origin.y, 
              self.contentView.frame.size.width - indentPoints, 
              self.contentView.frame.size.height); 
} 
+0

Cela fonctionne parfaitement! – Nathan

+1

Ceci est génial pour indenter la vue du contenu - merci! Que diriez-vous d'indenter la cellule elle-même? Je pensais que je supprimerais contentView de ce qui précède et regarder pour voir si indentationLevel n'est pas 0, mais cela semble icky. –

+3

ci-dessus code se bloque sur iOS8 – Gerry

1

Je pense que vous devez personnaliser le niveau d'indentation dans votre UITableViewCell personnalisé. Je suppose que cette méthode (et des méthodes telles que – tableView:heightForRowAtIndexPath:) ne seront pas modifiées dans le cas de UITableViewCell si votre commande UITableViewCell déjà spécifié, il

0

Si vous concevez un UITableViewCell dans un xib, vous allez utiliser la propriété cellulaire CustomView, qui n'utilise pas indentation automatiquement. Vous pouvez sous-classer UITableViewCell et implémenter layoutSubviews pour modifier votre image en fonction de l'indentation ou vous pouvez faire la même chose depuis n'importe où vous configurez vos cellules dans votre délégué de table ou source de données. Je souhaite que Apple implémente l'indentation pour les cellules personnalisées.