UIView 部分透明的实现方案

实现部分透明,本质就是,让透明的区域不绘制。

方案1: 使用path

- (instancetype)initWithFrame:(CGRect)frame
{
    if(self = [super initWithFrame:frame]) {
        //透明的区域
        CGRect rect = CGRectMake(200, 300, 150, 150);
        
        CAShapeLayer *fillLayer = [CAShapeLayer layer];
        fillLayer.fillRule = kCAFillRuleEvenOdd;
        fillLayer.fillColor = [UIColor blackColor].CGColor;
        fillLayer.opacity = 0.8;
        [self.layer addSublayer:fillLayer];
        
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:0];
        UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:8];
        [path appendPath:circlePath];
        [path setUsesEvenOddFillRule:YES];
        fillLayer.path = path.CGPath;
    }
    return self;
}
Screen.png

NOTE:需要设置fillRule = kCAFillRuleEvenOdd,否则不显示。
fillRule详解
方案2:使用mask
根据需求制作一张中间透明,其他地方半透明的照片,设置遮罩。

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"scene.jpg"]];
    imageView.frame = CGRectMake(0, 0, 100, 100);
    self.view.layer.mask = imageView.layer;

方案3:可以CoreGraphics实现,UIVIew中可以实现drawRect:

- (void)drawRect:(CGRect)rect
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, rect);
    //获取当前的图层上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //将路径添加到当前上下文
    CGContextAddPath(context, path);
    //设置填充颜色
    [[UIColor colorWithWhite:0 alpha:1.0] set];
    CGContextFillRect(context, rect);
    
    //绘制透明区域
    CGContextClearRect(context, CGRectMake(0, 0, 100, 100));
    CGContextDrawPath(context, kCGPathFillStroke);
    CFRelease(path);
}

方案4:设置混合模式。上述方案3可以设置矩形透明区域,但不能设置其他区域。

- (void)drawRect:(CGRect)rect
{
    //获取当前的图层上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //设置填充颜色
    [[UIColor colorWithWhite:.0 alpha:0.5] set];
    CGContextAddRect(context, rect);
    CGContextFillPath(context);
    
    //设置混合模式,为清空模式。
    CGContextSetBlendMode(context, kCGBlendModeClear);
    CGContextAddEllipseInRect(context, CGRectMake(100, 100, 200, 200));
    //绘制路径
    CGContextFillPath(context);
}

NOTE:需要设置view的背景色透明色,否则绘制不生效。

self.backgroundColor = [UIColor clearColor];

你可能感兴趣的:(UIView 部分透明的实现方案)