如何在UIVisualEffectView上进行透明剪切?

时间:2016-01-06 21:37:06

标签: ios objective-c uiview uivisualeffectview

在我的应用程序中,我通过继承简单的UIView来查看UIView。但是,如果我尝试使用UIVisualEffectView执行相同操作,则无法执行此操作。

以下是我使用普通UIView

所能做的事情

enter image description here

当我使用UIVisualEffectView代替绿色UIView时,我看不到透视UIView,即使将UIView添加到UIVisualEffectView作为{ {1}}。

enter image description here

代码:

subview

问题:为什么这不适用于- (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]; }

1 个答案:

答案 0 :(得分:0)

在ViewController.h文件中添加以下全局变量 -

CAShapeLayer *fillLayer;
UIVisualEffectView *overlayView;

在ViewController.m文件中添加以下方法 -

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

并将其称为 -

[self addOverlay:rect];