UITableViewCell в подклассе - backgroundView скрывает все, что я делаю в drawRect - PullRequest
6 голосов
/ 20 августа 2010

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

Ответы [ 4 ]

9 голосов
/ 20 августа 2010

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

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

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

4 голосов
/ 20 августа 2010

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

1 голос
/ 20 августа 2010

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

0 голосов
/ 20 августа 2010

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

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];
}
...