2016-01-06 27 views
6

Nella mia app, ho fatto un controllo attraverso UIView sottoclassi di semplici UIView. Tuttavia, se provo a fare lo stesso usando UIVisualEffectView, non sono in grado di farlo.Come eseguire un taglio trasparente su UIVisualEffectView?

Ecco quello che sono in grado di fare con una normale UIView:

enter image description here

Quando uso il UIVisualEffectView al posto del verde UIView, non riesco a vedere il vedere attraverso UIView, anche se vedere attraverso UIView è aggiunto allo UIVisualEffectView come subview.

enter image description here

Codice:

- (void)drawRect:(CGRect)rect { //this is same for the UIVIew and for the UIVisualEffectView 
    [super drawRect:rect]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    // Clear any existing drawing on this view 
    // Remove this if the hole never changes on redraws of the UIView 
    CGContextClearRect(context, self.bounds); 

    // Create a path around the entire view 
    UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:self.bounds]; 

    // Your transparent window. This is for reference, but set this either as a property of the class or some other way 
    CGRect transparentFrame; 
    // Add the transparent window 
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:transparentFrame cornerRadius:5.0f]; 
    [clipPath appendPath:path]; 

    // NOTE: If you want to add more holes, simply create another UIBezierPath and call [clipPath appendPath:anotherPath]; 

    // This sets the algorithm used to determine what gets filled and what doesn't 
    clipPath.usesEvenOddFillRule = YES; 
    // Add the clipping to the graphics context 
    [clipPath addClip]; 

    // set your color 
    UIColor *tintColor = [UIColor greenColor]; 

    // (optional) set transparency alpha 
    CGContextSetAlpha(context, 0.7f); 
    // tell the color to be a fill color 
    [tintColor setFill]; 
    // fill the path 
    [clipPath fill]; 
} 

Domanda: perché questo non ha funzionato con UIVisualEffectView?

+0

Ciao Teja, potresti essere in grado di ottenere le funzionalità che hai menzionato in questo post. Se è così, puoi aiutarmi o suggerire qualche ritocco per il codice fornito nel seguente post. http://stackoverflow.com/questions/39165751/circle-masking-for-image-cropping-in-ios?noredirect=1#comment65676404_39165751 –

+0

@sree_iphonedev farà una volta che sono davanti al computer! –

+0

Hai risolto il problema alla fine? –

risposta

0

Aggiungere le seguenti variabili globali nel ViewController.h File-

CAShapeLayer *fillLayer; 
UIVisualEffectView *overlayView; 

Add seguenti metodi nel tuo ViewController.m file-

-(void)addOverlay:(CGRect)rect{ 

    float x = rect.origin.x; 
    float y = rect.origin.y; 
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height) cornerRadius:0]; 
    UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(x, y, rect.size.width, rect.size.height) cornerRadius:5]; 

    [path appendPath:circlePath]; 
    [path setUsesEvenOddFillRule:YES]; 

    [self removeOverlay]; 
    overlayView = [[UIVisualEffectView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height+64)]; 
    overlayView.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:overlayView]; 

    fillLayer = [CAShapeLayer layer]; 
    fillLayer.path = path.CGPath; 

    fillLayer.fillRule = kCAFillRuleEvenOdd; 

    fillLayer.fillColor = [UIColor colorWithRed:78/255.0 green:103/255.0 blue:135/255.0 alpha:1.0].CGColor; 
    fillLayer.opacity = 0.85; 
    [[UIApplication sharedApplication].keyWindow.layer addSublayer:fillLayer]; 

} 

-(void)removeOverlay{ 
    [overlayView removeFromSuperview]; 
    [fillLayer removeFromSuperlayer]; 
} 

e lo chiamano come -

[self addOverlay:rect]; 
Problemi correlati