Как backgroundColor обрабатывается для UIView в Objective_C? - PullRequest
3 голосов
/ 03 июня 2011

Я играл с примером кода Apple для настройки UITableViewCells. Я столкнулся с некоторым странным поведением, которое оставило меня полностью запутанным о том, как работает backgroundColor.

Следующий код представляет собой значительно уменьшенную версию примера пользовательского UIView Apple в пользовательском UITableViewCell. Функция init устанавливает цвет фона на фиолетовый, а затем drawRect устанавливает цвет фона на зеленый. Я ожидаю, что никогда не увижу фиолетового, но это все, что я вижу. Из операторов NSLog я знаю, что метод init вызывается для каждой из ячеек, после чего вызывается drawRect для каждой из ячеек. Зеленая настройка, кажется, игнорируется. Если я позвоню [self setNeedsDisplay] в любое время после начальной загрузки, фон будет правильно настроен на зеленый.

- (id)initWithFrame:(CGRect)frame {
    counter = 0;
    if ((self = [super initWithFrame:frame])) {
        self.opaque = YES;
        self.backgroundColor = [UIColor purpleColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect { 
    self.backgroundColor = [UIColor greenColor];
}

Может кто-нибудь объяснить мне, почему это происходит так?

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Ваша реализация -drawRect: на самом деле не рисует, поэтому сама ничего не изменит.

Предположительно, рисование выполняется слоем, связанным с вашим видом. Похоже, что в вашей среде фоновый слой рисует перед вызовом вашего -drawRect: метода. Когда слой перерисовывается, ваш -drawRect: метод также вызывается. Таким образом, после изменения цвета фона вы не увидите никаких изменений до тех пор, пока фоновый слой не будет отрисован снова, что можно сказать, произошло потому, что ваш -drawRect: вызван снова.

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

0 голосов
/ 03 июня 2011

Не могли бы вы опубликовать код для cellForRowAtIndexPath ??

Почему вы не попытались использовать

cell.textLabel.textColor = [UIColor purpleColor];
...