UITableViewCell в подклассах - backgroundView скрывает все, что я делаю в drawRect

Я пытаюсь создать подкласс 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;

6
задан Jim Rhoades 27 June 2011 в 20:20
поделиться

4 ответа

На самом деле вы не должны смешивать рисунок с вашей ячейкой таким образом, вы работаете на более низком уровне, чем работает механизм UITableViewCell, и именно поэтому вы получаете эту проблему.

Это лишь одна из различных проблем, с которыми вы столкнетесь. По мере продвижения по этому пути вы столкнетесь и с другими проблемами, включая проблемы с тем, как работает выделение.

Правильный подход заключается в создании пользовательского представления UIView, содержащего код для рисования, а затем вы можете добавить его в корневое представление вашей ячейки. Это позаботится о рендеринге в правильном порядке, не будет вмешиваться в систему выделения и будет работать правильно в данном случае.

9
ответ дан 9 December 2019 в 20:38
поделиться

Вам не следует переопределять -drawRect: ячейки таблицы. Вместо этого создайте новое пользовательское представление и добавьте его к contentView ячейки, и рисуйте в нем.

4
ответ дан 9 December 2019 в 20:38
поделиться

Вот решение, которое немного запутано, но оно точно соответствует моим требованиям ... с одним фатальным недостатком: когда ячейки используются повторно, звездный угол появляется тогда, когда я этого не хочу.

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];
}
-2
ответ дан 9 December 2019 в 20:38
поделиться

Вы пробовали добавить туда [super drawRect: rect]; ?

1
ответ дан 9 December 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: