web-dev-qa-db-fra.com

Définition d'un arrière-plan transparent CGContext

J'ai toujours du mal à tracer une ligne avec CGContext. En fait, je suis allé à la ligne pour dessiner, mais maintenant j'ai besoin que l'arrière-plan du Rect soit transparent pour que l'arrière-plan existant s'affiche à travers. Voici mon code de test:

(void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);
    CGContextSetAlpha(context,0.0);
    CGContextFillRect(context, rect);

    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 5.0);
    CGContextMoveToPoint(context, 100.0,0.0);
    CGContextAddLineToPoint(context,100.0, 100.0);
    CGContextStrokePath(context);
}

Des idées?

50
Jim B

Après UIGraphicsGetCurrentContext() appelez CGContextClearRect(context,rect)

Edit: D'accord, j'ai compris.

Votre vue personnalisée avec la ligne doit avoir les éléments suivants:

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setBackgroundColor:[UIColor clearColor]];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 5.0);
    CGContextMoveToPoint(context, 100.0,0.0);
    CGContextAddLineToPoint(context,100.0, 100.0);
    CGContextStrokePath(context);
}

Mon test l'a utilisé comme un UIViewController très basique:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImageView *v = [[UIImageView alloc] initWithFrame:self.view.bounds];
    [v setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:v];
    TopView *t = [[TopView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:t];
    [v release];
    [t release];
}
70
David Kanarek

Moyen facile:

- (id)initWithFrame:(CGRect)frame
{
    if ((self = [super initWithFrame:frame]))
    {       
        self.opaque = NO;
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    //your code
}
41
ZGl6YXNt

Initier un contexte avec opaque == false, Swift 3

UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) 

opaque

Un indicateur booléen indiquant si le bitmap est opaque. Si vous savez que le bitmap est entièrement opaque, spécifiez true pour ignorer le canal alpha et optimiser le stockage du bitmap. La spécification de faux signifie que le bitmap doit inclure un canal alpha pour gérer les pixels partiellement transparents.

4
onmyway133

C'est ce qui a fonctionné pour moi avec un UIImage qui avait été ajouté manuellement à l'aide d'InterfaceBuilder.

- (id)initWithCoder:(NSCoder *)aDecoder {

    if(self = [super initWithCoder:aDecoder]) {
        self.backgroundColor = [UIColor clearColor];
    }

    return self;
}


-(void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();    
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 5.0);
    CGContextMoveToPoint(context, 100.0,0.0);
    CGContextAddLineToPoint(context,100.0, 100.0);
    CGContextStrokePath(context);
}

La réponse de David Kanarek ne fonctionne que lorsque vous créez manuellement votre propre UIImageView. Si vous avez créé un UIView et l'ajouté manuellement via Interface Builder, vous aurez besoin d'une approche différente comme celle-ci appelant la méthode initWithCoder à la place.

4
Patrick Collins

J'ai le même problème, alors je le trouve. J'écrase la méthode init est -(id)initWithFrame:(CGRect)rect. Dans cette méthode self.background = [UIColor clearColor]; mais j'utilise cette vue dans le fichier xib !!! Cela appellera la méthode init est

-(id)initWithCoder:(NSCoder*)aDecoder;

Remplacez donc toute la méthode init et la configuration BackgroundColor fonctionnera correctement.

3
en-菜鸟..
CGContextClearRect(context,rect) 

Si le contexte fourni est un contexte de fenêtre ou de bitmap, Quartz efface efficacement le rectangle. Pour les autres types de contexte, Quartz remplit le rectangle en fonction du périphérique. Cependant, vous ne devez pas utiliser cette fonction dans des contextes autres que les contextes fenêtre ou bitmap.

2
Codrut

vous pouvez créer un contexte d'image avec ce code:

cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);
CGContextSetRGBFillColor(cacheContext, 0, 0, 0, 0);
CGContextFillRect(cacheContext, (CGRect){CGPointZero, size});

la clé est kCGImageAlphaPremultipliedLast.

1
fluke

Vous ne parvenez pas à comprendre la question ici, mais si vous ne parvenez pas à afficher UIView "d'arrière-plan" à travers une vue "de dessus" dans laquelle vous dessinez, une solution est topView.backgroundColor = [UIColor clearColor]; J'avais (je pense) ce même problème et cela l'a résolu pour moi.

0
oflannabhra