Я пытаюсь создать подкласс UITableViewCell, где я рисую изображение в верхнем правом углу. У меня это работает отлично - за исключением того, что когда я устанавливаю self.backgroundView, мое фоновое изображение закрывает изображение, нарисованное в drawRect.
Должен быть способ установить фоновое изображение (и selectedBackgroundView), не закрывая то, что ' Это делается в drawRect.
Я поступаю неправильно?
РЕДАКТИРОВАТЬ: Я опубликовал пример проекта с проблемой .
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
// TODO: figure out why this covers up self.starImage that's drawn in drawRect
self.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellBackground.png"]] autorelease];
}
return self;
}
- (void)drawRect:(CGRect)rect {
[self.starImage drawAtPoint:CGPointMake(self.bounds.size.width - self.starImage.size.width, 0.0)];
}
РЕДАКТИРОВАТЬ 2: по запросу AWrightIV, Вот как я получил это работает ... который не требует подклассов UITableViewCell вообще. Я просто добавляю подпредставление для cell.backgroundView:
// create a UIImageView that contains the background image for the cell
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellBackground.png"]];
// create another UIImageView that contains the corner image
UIImage *starRedImage = [UIImage imageNamed:@"starcorner_red.png"];
UIImageView *starImageView = [[UIImageView alloc] initWithFrame:CGRectMake(297,
0,
starRedImage.size.width,
starRedImage.size.height)];
starImageView.image = starRedImage;
// add the corner UIImageView as a subview to the background UIImageView
[bgImageView addSubview:starImageView];
// set cell.background to use the background UIImageView
cell.backgroundView = bgImageView;
На самом деле вы не должны смешивать рисунок с вашей ячейкой таким образом, вы работаете на более низком уровне, чем работает механизм UITableViewCell, и именно поэтому вы получаете эту проблему.
Это лишь одна из различных проблем, с которыми вы столкнетесь. По мере продвижения по этому пути вы столкнетесь и с другими проблемами, включая проблемы с тем, как работает выделение.
Правильный подход заключается в создании пользовательского представления UIView, содержащего код для рисования, а затем вы можете добавить его в корневое представление вашей ячейки. Это позаботится о рендеринге в правильном порядке, не будет вмешиваться в систему выделения и будет работать правильно в данном случае.
Вам не следует переопределять -drawRect: ячейки таблицы. Вместо этого создайте новое пользовательское представление и добавьте его к contentView ячейки, и рисуйте в нем.
Вот решение, которое немного запутано, но оно точно соответствует моим требованиям ... с одним фатальным недостатком: когда ячейки используются повторно, звездный угол появляется тогда, когда я этого не хочу.
http://dl.dropbox.com/u/2349787/UIImage_Position_subclassed_cell2.zip
Я все еще использую здесь drawRect, но только потому, что self.starImage имеет значение null, если вы обращаетесь к нему в методе initWithStyle. Кроме того, вместо добавления подпредставления в self.contentView я добавляю его в self.backgroundView, чтобы кнопка удаления ячейки не мешала ему. Звездный угол расположен правильно как в портретном, так и в ландшафтном режиме, а также отлично работает в режиме редактирования.
Что касается проблемы повторного использования ячеек, это все еще невозможно ... так что, может быть, я снова попытаюсь сделать это без создания подкласса UITableViewCell.
Я открыт для любых дальнейших предложений. Спасибо!
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
// Initialization code
self.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellBackground.png"]] autorelease];
}
return self;
}
- (void) drawRect:(CGRect)rect {
UIImageView *imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(self.bounds.size.width - self.starImage.size.width, 0, self.starImage.size.width, self.starImage.size.height)] autorelease];
imageView.image = self.starImage;
imageView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
[self.backgroundView addSubview:imageView];
}