UIView裁剪矩形 镂空(中间透明,周围半透明)

重写View的drawRect方法

- (instancetype)initWithTargetView:(UIView *)targetView
{
    self = [super init];
    if (self) {
        self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.3];
        self.frame = [UIScreen mainScreen].bounds;
        self.alpha = 0;
        _targetView = targetView;
    }
    return self;
}


+ (instancetype)guideViewWithTargetView:(UIView *)targetView{
    return [[GuideView alloc] initWithTargetView:targetView];
}

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    if (self.targetView) {
        CGRect frame = [self.targetView convertRect:self.targetView.bounds toView:kAppDelegate.window];
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextClearRect(ctx, frame);
    }
}

- (void)show{
    [kAppDelegate.window addSubview:self];
    [UIView animateWithDuration:0.3 animations:^{
        self.alpha = 1;
    }];
}

- (void)disMiss{
    [UIView animateWithDuration:0.3 animations:^{
        self.alpha = 0;
    } completion:^(BOOL finished) {
          [self removeFromSuperview];
    }];
}

- (void)addTarget:(id)target action:(SEL)action{
    [self disMiss];
    
}


如果想要裁剪出一个圆的话,则需要结合贝塞尔曲线了
    CGRect frame = [view convertRect:view.bounds toView:kAppDelegate.window];// 把你想要露出来的view传进来就行
    
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:kAppDelegate.window.bounds cornerRadius:0];
    UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:view.width/2.0];
    [path appendPath:circlePath];
    [path setUsesEvenOddFillRule:YES];
    
    CAShapeLayer *fillLayer = [CAShapeLayer layer];
    fillLayer.path = path.CGPath;
    fillLayer.fillRule = kCAFillRuleEvenOdd;
    fillLayer.fillColor = [UIColor blackColor].CGColor;
    fillLayer.opacity = 0.3;
    [self.layer addSublayer:fillLayer];

也可以通过layer的Mask实现

    CGRect frame = [view convertRect:view.bounds toView:kAppDelegate.window]; // 把你想要露出来的view传进来
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:kAppDelegate.window.bounds];
    [path appendPath:[[UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:view.layer.cornerRadius] bezierPathByReversingPath]];
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.path = path.CGPath;
    [self.layer setMask:shapeLayer];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值