2009-09-22 6 views
0

Dans mon application de test, je souhaite styliser des cellules de table à hauteur variable avec une seule ligne de pixels en haut. C'est le code de dessin que j'utilise, mais ça ne marche pas.
est Ci-dessous le code de l'en-tête:Comment empêcher une bordure d'un pixel de hauteur variable UITableViewCell de sortir en tant que pixels multiples?

// In OneLine.h 
@interface OneLine : UIView {} 
@end 

Et le code de dessin:

// In OneLine.m 
- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    [[UIColor blackColor] set]; 
    UIRectFill(rect); 
    [[UIColor whiteColor] set]; 
    UIRectFill(CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, 1)); 
} 
- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     // Initialization code 
     self.contentMode = UIViewContentModeTop; 
    } 
    return self; 
} 

Le seul problème est que je me retrouve avec une ligne blanche de hauteur variable. Ce n'est pas toujours un pixel de haut. Qu'est-ce que je fais mal? J'ai un contrôleur de vue de table utilisé pour fournir des cellules de test. Je l'initialise comme ceci:

// In MyTable.h 
#import <UIKit/UIKit.h> 

@interface MyTable : UITableViewController { 
    NSMutableArray *data; 
} 
@end 

Avec le code (seulement les méthodes ajoutées/changées du modèle par défaut).

// In MyTable.m 
#import "MyTable.h" 
#import "OneLine.h 

@implementation MyTable 
- (id)initWithStyle:(UITableViewStyle)style { 
    if (self = [super initWithStyle:style]) { 
     srand(time(NULL)); 
     data = [[NSMutableArray alloc] init]; 
     for (size_t index = 0; index < 200; ++index) { 
      // Each cell has a different height betweet 40 and 50 pixels tall. 
      [data addObject:[NSNumber numberWithInt:(rand() % 10) + 40.5]]; 
     } 
    } 
    return self; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease]; 
     cell.contentView.contentMode = UIViewContentModeTop; 
     OneLine *view = [[OneLine alloc] initWithFrame:cell.contentView.bounds]; 
     [cell.contentView addSubview:view]; 
    } 

    // Set up the cell... 
    OneLine *view = [cell.contentView.subviews objectAtIndex:[cell.contentView.subviews count] - 1]; 
    // Build the correct frame 
    view.frame = CGRectMake(0, 0, cell.contentView.bounds.size.width, [MyTable tableView:(UITableView*)self.view heightForRowAtIndexPath:indexPath]); 
    return cell; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [data count]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSNumber *num = (NSNumber*) [data objectAtIndex:indexPath.row]; 
    return [num intValue]; 
} 
@end 

Tout ce code crée juste un contrôleur de vue de la table avec 200 cellules de

Répondre

0

hauteur aléatoire (entre 40 et 50 pixels de haut. Eh bien, il se trouve, j'ai trouvé la solution à mon problème Dans le code ci-dessus, vous verrez que la hauteur des cellules du tableau n'est pas un nombre rond (j'ai corrigé le code pour montrer le vrai problème.) En fait, quand vous avez des cellules de table de taille fractionnaire, vous pouvez être à un pixel fractionnaire, et un rectangle ou une ligne commençant à l'origine peut laisser un espace vide, et la hauteur finale de la cellule peut se fondre dans la cellule suivante.Alors, évitez les tablecells de hauteur fractionnaire

+0

De plus, le paramètre rect à drawRect: method n'est PAS le rectangle entier de la vue, c'est le rect de la zone qui est invalide et doit être repeint (voir setNeedsDisplayInRect :). Dans la plupart des cas, cela sera équivalent à [self bounds], mais si setNeedsDisplayInRect: est jamais appelé, cela pourrait ne pas être le cas – rpetrich

Questions connexes