En théorie, vous pouvez facilement définir la couleur de fond via:
self.backgroundColor = [UIColor redColor];
dans drawRect, mais cela n’a aucun effet. Vous pouvez modifier la taille de la vue, ses bordures, ses sous-vues, etc., mais pas la couleur d'arrière-plan. Des requêtes similaires SO suggèrent d'ajouter une sous-vue ou de changer la couleur d'arrière-plan dans les messages d'initialisation initWithFrame ou initWithCoder. Ma question est la suivante: pourquoi ne fonctionne-t-il pas dans drawRect lorsque d’autres caractéristiques peuvent être modifiées?
Changer le calque de la vue backgroundColor ne fait également rien, peut-être pour la même raison. Quelle est la relation entre backgroundColor de la vue et backgroundColor de son calque, car ils ne sont pas identiques?
Si vous définissez backgroundColor
lors de la configuration initiale de la vue (avant le système appelle drawRect
), cette backgroundColor
sera utilisée sans code supplémentaire de votre part. Comme l'indique la référence de classe UIView
, la propriété backgroundColor
est utilisée pour "définir la couleur de la vue plutôt que de dessiner cette couleur vous-même".
Mais si vous essayez de le définir dans drawRect
, le remplissage d'arrière-plan a déjà été effectué. Vous ne verrez donc pas immédiatement l'effet de la modification de la couleur d'arrière-plan (à moins que vous ne remplissiez vous-même manuellement drawRect
). La méthode drawRect
doit être utilisée pour rendre la vue, pas pour la configurer.
Si la UIView
définit la backgroundColor
lors de la configuration de la vue (par exemple, quelle que soit la méthode init
dont vous disposez), cette couleur d'arrière-plan sera utilisée, sans qu'il soit nécessaire de faire autre chose dans drawRect
.
Comme Rob l'a indiqué dans sa réponse, l'arrière-plan a déjà été établi lorsque la méthode drawRect
est appelée. Si vous avez besoin de changer la couleur de fond à ce stade, vous devrez la dessiner vous-même:
[self.backgroundColor setFill];
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
Vous pouvez donc toujours modifier la valeur de la propriété, mais celle-ci ne sera utilisée que lorsque la vue sera à nouveau dessinée.
Mise à jour pour Swift3 sur la fonction drawRect
:
self.backgroundColor = UIColor.red
self.backgroundColor?.setFill()
UIGraphicsGetCurrentContext()!.fill(rect);
Définissez la couleur de fond dans votre fonction awakeFromNib
:
// Objective-C
- (void)awakeFromNib {
self.backgroundColor = [UIColor redColor];
}
// Swift
override func awakeFromNib() {
backgroundColor = UIColor.red
}