UITableViewCell не очищает контекст перед рисованием - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть подкласс UITableViewCell, который содержит несколько элементов - UIImageViews, Labels и т. Д.
Поскольку эта ячейка предназначена для многократного использования, я хочу немного изменить ее внешний вид в зависимости от того, какие данные она отображает в данный момент.

Так, в качестве примера - у меня есть это представление в моем пользовательском UITableViewCell:

UIImageView* delimeterView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellDelimiter.png"]];

Который я бы хотел скрыть, иногда так:

- (void) setRecord:(id)record__ {  
    if (record__.type == NO_DELIMETER_VIEW)  
        delimeterView.hidden = YES;  
    else  
        delimeterView.hidden = NO;
    [self setNeedsLayout];   
} 

Но проблема в том, что delimeterView всегда будет отображаться в ячейке, как если бы он был нарисован один раз в методе init, а затем контекст рисования никогда не изменялся и не очищался. Я попытался установить для свойства clearsContextBeforeDrawing значение YES как для ячейки, так и для ее contentView. Я также попытался установить для opaque для ячейки и ее contentView значение NO, поскольку я прочитал, что в этом случае могут возникнуть некоторые проблемы, если вы используете прозрачный вид.
Ничего не помогает.
Похоже, UITableViewCell никогда не очищает свой графический контекст и просто закрашивает старые элементы.
Любые советы о том, что я делаю не так? Я знаю, что, возможно, смогу исправить это, выполняя пользовательский рисунок, но я бы предпочел этого не делать.

1 Ответ

1 голос
/ 10 февраля 2010

Во-первых, вы уверены, что delimeterView в setRecord: действительно указывает на ваш delimeterView? В приведенном вами примере кода вы назначаете его локальному. Вы позже назначаете это на ивара? (Вы всегда должны использовать средства доступа для доступа к ivars: self.delimeterView).

Далее, вызов -setNeedsLayout просто планирует вызов на -layoutIfNeeded, что обходит иерархию, вызывая -layoutSubviews. Реализация по умолчанию -layoutSubviews ничего не делает. Вы, вероятно, хотели вызвать -setNeedsDisplay здесь, или вам нужно реализовать -layoutSubviews, чтобы делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...