Lorsque j'ajoute une UIView
à un contrôleur de vue par programme, je ne peux pas modifier la couleur d'arrière-plan en une autre couleur, elle reste toujours noire.
- (void)drawRect:(CGRect)rect
{
// Drawing code
self.backgroundColor = [UIColor blueColor];
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
Lorsque je commente drawrect:
out et ajoute self.backgroundColor = [UIColor blueColor];
à l'initialiseur, la couleur change:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.backgroundColor = [UIColor blueColor]
}
return self;
}
Pourquoi est-ce et que dois-je changer? En fait, j'aimerais que l'arrière-plan soit transparent.
backgroundColor
de votre vue est ignorée si vous dessinez vous-même avec drawRect
. Changez votre code en
- (void)drawRect:(CGRect)rect
{
// Drawing code
[[UIColor blueColor] setFill]; // changes are here
UIRectFill(rect); // and here
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
Au fur et à mesure que vous implémentez drawRect:
, cela remplacera tout dessin par défaut de la UIView
.
Vous devez définir la propriété opaque
de votre vue personnalisée sur NO
et effacer le contexte avant de rendre le chemin:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.opaque = NO;
}
return self;
}
- (void)drawRect:(CGRect)rect
{
// Drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
Une vue opaque est censée se remplir de contenu entièrement opaque . En d'autres termes, le contenu doit avoir une valeur alpha de 1,0. Si la vue Est opaque et ne remplit pas ses limites ou contient un contenu entièrement Ou partiellement transparent, les résultats sont imprévisibles. Vous Devez toujours définir la valeur de cette propriété sur NO si la vue est Totalement ou partiellement transparente.
Définissez la couleur d'arrière-plan dans la méthode initWithFrame: et faites votre dessin personnalisé dans drawRect :. Cela devrait pouvoir résoudre votre problème. DrawRect: est implémenté afin de faire un dessin personnalisé pour ne pas définir les propriétés spécifiques à la vue.
@implementation MyView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor yellowColor];
}
return self;
}
- (void)drawRect:(CGRect)rect{
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(100, 33)];
[path addLineToPoint:CGPointMake(200, 33)];
path.lineWidth = 5;
[[UIColor redColor] setStroke];
[path stroke];
}
@end
backgroundViewController.providesPresentationContextTransitionStyle = YES;
backgroundController.definesPresentationContext = YES;
[overlayViewController setModalPresentationStyle:UIModalPresentationOverCurrentContext];
ou
Je me suis battu pendant plusieurs heures. S'il s'agit d'une séquence modèle, définissez le contexte actuel en tant que propriété. !