web-dev-qa-db-fra.com

Pourquoi ne pouvez-vous pas modifier une couleur d'arrière-plan UIView dans drawRect?

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?

20
farhadf

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.

25
Rob

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.

7
robert

Mise à jour pour Swift3 sur la fonction drawRect

    self.backgroundColor = UIColor.red
    self.backgroundColor?.setFill()
    UIGraphicsGetCurrentContext()!.fill(rect);
1
Fares Ben Hamouda

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
}
0
Simon Germain