Почему вы не можете изменить цвет фона UIView в drawRect?
В теории вы можете легко установить цвет фона с помощью:
self.backgroundColor = [UIColor redColor];
в drawRect, но это не имеет никакого эффекта. Вы можете изменить размер представления, его границы, его подпункты и т.д., Но не цвет фона. Аналогичные запросы SO предлагают добавить subView или изменить backgroundColor в сообщениях инициализации initWithFrame или initWithCoder. Мой вопрос в том, почему он не работает в drawRect, когда другие характеристики могут быть изменены?
Изменение слоя представления backgroundColor также не делает ничего, по той же причине. Какова связь между представлением backgroundColor и его слоем backgroundColor, поскольку они не совпадают?
Ответы
Ответ 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
}