2016-01-06 18 views
6

W mojej aplikacji przejrzałem UIView przez podklasowanie prostych UIView. Jeśli jednak spróbuję zrobić to samo, używając UIVisualEffectView, nie jestem w stanie tego zrobić.Jak zrobić przezroczyste cięcie na UIVisualEffectView?

Oto, co jestem w stanie zrobić za pomocą normalnego UIView:

enter image description here

Kiedy używam UIVisualEffectView zamiast zielonej UIView, nie mogę zobaczyć przejrzeć UIView, chociaż przejrzeć UIView jest dodano do UIVisualEffectView jako subview.

enter image description here

Kod:

- (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]; 
} 

Pytanie: Dlaczego to nie działa z UIVisualEffectView?

+0

Cześć Teja, Mógłbyś móc osiągnąć funkcjonalność wspomnianą w tym poście. Jeśli tak, możesz mi pomóc lub zaproponować kilka poprawek dla kodu podanego w następującym poście. http://stackoverflow.com/questions/39165751/circle-masking-for-image-cropping-in-ios?noredirect=1#comment65676404_39165751 –

+0

@sree_iphonedev zrobi, gdy znajdę się przed komputerem! –

+0

Czy ostatecznie to rozwiązałeś? –

Odpowiedz

0

Dodaj następujący zmiennych globalnych w swojej ViewController.h Plik-

CAShapeLayer *fillLayer; 
UIVisualEffectView *overlayView; 

Dodaj następujący metod w swojej ViewController.m Plik-

-(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]; 
} 

i nazywają to jak -

[self addOverlay:rect];