UIView 部分透明的实现方案
2018-06-26 本文已影响22人
似奔跑的野马
实现部分透明,本质就是,让透明的区域不绘制。
方案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];