如何使超视图的选定区域透明

时间:2013-10-08 00:09:51

标签: ios objective-c cocoa-touch uiview

我们有什么办法可以让超级视图的选定区域透明化吗?我有一个黑色(alpha 0.5)背景颜色的UIView。我在UIView上放了一些空心圆圈,并希望UIView下方是透明的,这样我才能看透它。任何想法

- (id)initWithFrame:(CGRect)iFrame andHollowFrames:(NSArray *)iHollowFrames withRadius:(NSNumber *)iRadius {
    if ((self = [super initWithFrame:iFrame]) != nil) {
        self.hollowFrames =  [[NSSet setWithArray:iHollowFrames] allObjects];
        self.hollowCircleRadius = iRadius;
        [self addShadowView];
    }

    return self;
}


- (void)addShadowView {
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height) cornerRadius:0];

    for (NSValue *point in self.hollowFrames) {
        UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(point.CGPointValue.x - self.hollowCircleRadius.floatValue, point.CGPointValue.y - self.hollowCircleRadius.floatValue, 2.0 * self.hollowCircleRadius.floatValue, 2.0 * self.hollowCircleRadius.floatValue) cornerRadius:self.hollowCircleRadius.floatValue];

        [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.5;
    [self.layer addSublayer:fillLayer];
}

1 个答案:

答案 0 :(得分:0)

这是一个UIView子类解决方案。为了使其工作,您必须将superviews backgroundColor属性保留为nil witch是默认值。如果此UIView-subclass位于故事板中,请确保在属性检查器中将背景颜色设置为“清除颜色”。

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    UIColor *blackBackgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
    CGContextSetFillColorWithColor(ctx, blackBackgroundColor.CGColor);
    CGContextFillRect(ctx, rect);
    CGRect transparentPart = CGRectMake(10, 10, 120, 80);
    CGContextClearRect(ctx, transparentPart);
}