Подтвердить что ты не робот

Почему вы не можете изменить цвет фона UIView в drawRect?

В теории вы можете легко установить цвет фона с помощью:

self.backgroundColor = [UIColor redColor];

в drawRect, но это не имеет никакого эффекта. Вы можете изменить размер представления, его границы, его подпункты и т.д., Но не цвет фона. Аналогичные запросы SO предлагают добавить subView или изменить backgroundColor в сообщениях инициализации initWithFrame или initWithCoder. Мой вопрос в том, почему он не работает в drawRect, когда другие характеристики могут быть изменены?

Изменение слоя представления backgroundColor также не делает ничего, по той же причине. Какова связь между представлением backgroundColor и его слоем backgroundColor, поскольку они не совпадают?

4b9b3361

Ответ 1

Если вы установите backgroundColor, когда представление сначала настроено (то есть до того, как OS вызывает drawRect), этот backgroundColor будет использоваться без какого-либо дополнительного кода с вашей стороны. Как указано в UIView Ссылка на класс, свойство backgroundColor используется, чтобы "установить цвет представлений, а не рисовать этот цвет самостоятельно".

Но если вы попытаетесь установить его в drawRect, фоновое заполнение уже выполнено, поэтому вы не увидите эффект изменения цвета фона (если только вы не вручную выполняете другое заполнение в drawRect), Метод drawRect должен использоваться для рендеринга представления, а не для его настройки.

Если UIView устанавливает backgroundColor по мере настройки вида (например, в зависимости от того, какой метод init вы используете), этот фоновый цвет будет использоваться без необходимости делать что-либо еще в drawRect.

Ответ 2

Как сказал Роб в своем ответе, фон уже нарисован при вызове метода drawRect. Если вам нужно изменить цвет фона в этот момент, вам придется сделать его самостоятельно:

[self.backgroundColor setFill];
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);

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

Ответ 3

Обновление для функции swift3 on drawRect:

    self.backgroundColor = UIColor.red
    self.backgroundColor?.setFill()
    UIGraphicsGetCurrentContext()!.fill(rect);

Ответ 4

Установите цвет фона в функцию awakeFromNib:

// Objective-C
- (void)awakeFromNib {
    self.backgroundColor = [UIColor redColor];
}

// Swift
override func awakeFromNib() {
    backgroundColor = UIColor.red
}