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
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