使用 CALayers 遮罩以在褪色的黑色视图中显示空心圆圈

Posted

技术标签:

【中文标题】使用 CALayers 遮罩以在褪色的黑色视图中显示空心圆圈【英文标题】:Masking with CALayers to have hollow circles in faded black view 【发布时间】:2013-09-20 19:14:38 【问题描述】:

我想绘制一个带有一些圆圈的褪色黑色背景颜色的视图。它看起来应该是圆形部分应该是空心的,我应该能够看到下面的视图。

CALayer 掩码对我没有帮助,或者我可能没有以正确的方式应用它们(请参阅下面的注释代码)。

下面是我的代码,附件是我现在看到的截图。

预期:带有空心圆圈的黑色褪色视图。

任何建议

#pragma Initializer

- (id)initWithFrame:(CGRect)iFrame andHollowFrames:(NSArray *)iHollowFrames 
    if ((self = [super initWithFrame:iFrame]) != nil) 
        self.hollowFrames = [NSArray arrayWithArray:iHollowFrames];
        //self.layer.backgroundColor = CGColorCreateCopyWithAlpha([UIColor blackColor].CGColor, 0.5);

        CAShapeLayer *circle1 = [self circleAt:CGPointMake(20.0, 20.0) ForRadius:10.0 withColor:[UIColor blackColor].CGColor andDashPattern:NO];
        CAShapeLayer *circle2 = [self circleAt:CGPointMake(120.0, 20.0) ForRadius:10.0 withColor:[UIColor blackColor].CGColor andDashPattern:NO];

        CALayer *myLayer = [CAShapeLayer layer];
        myLayer.frame = self.frame;
        myLayer.backgroundColor = CGColorCreateCopyWithAlpha([UIColor blackColor].CGColor, 0.5);
        [self.layer addSublayer:myLayer];

//        [circle1 setMask:myLayer];
//        [circle2 setMask:myLayer];

        [self.layer addSublayer:circle1];
        [self.layer addSublayer:circle2];
    
    return self;




#pragma Drawing Methods

- (CAShapeLayer *)circleAt:(CGPoint)iPoint ForRadius:(CGFloat)iRadius withColor:(CGColorRef)iColor andDashPattern:(BOOL)isDashPattern 
    CAShapeLayer *aSignalcircle = [CAShapeLayer layer];
    aSignalcircle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(iPoint.x, iPoint.y, 2.0 * iRadius, 2.0 * iRadius) cornerRadius:iRadius].CGPath;
    aSignalcircle.position = CGPointMake(0.0 - iRadius, 0.0 - iRadius);
    aSignalcircle.fillColor = [UIColor clearColor].CGColor;
    aSignalcircle.strokeColor = iColor;
    aSignalcircle.lineWidth = kPSSignalStrokeWidth;
    aSignalcircle.backgroundColor = [UIColor clearColor].CGColor;


    if (isDashPattern) 
        aSignalcircle.lineDashPattern = @[@1, @1];
    

    return aSignalcircle;

【问题讨论】:

【参考方案1】:

用下面的代码让它工作:

- (void)addShadowView 
    self.hollowFrames = @[[NSValue valueWithCGPoint:CGPointMake(20.0, 20.0)], [NSValue valueWithCGPoint:CGPointMake(120.0, 20.0)]];

    int radius = 15.0;
    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, point.CGPointValue.y, 2.0*radius, 2.0*radius) cornerRadius:radius];
        [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];

【讨论】:

【参考方案2】:

我在尝试使用我的代码做某事时遇到了类似的问题,我通过使用颜色填充它然后使用背景创建一个与可视窗口大小相同的新层来解决此问题成为一个 colorClear 然后在那里使用掩码(哦,稍后发送回全屏)。您的问题是,在渲染图层时,即使在剪切之后,背景颜色也会显示出来,而不是通过该级别,因为它是视图堆栈的底部。

【讨论】:

以上是关于使用 CALayers 遮罩以在褪色的黑色视图中显示空心圆圈的主要内容,如果未能解决你的问题,请参考以下文章

Swift:沿贝塞尔路径渐变(使用 CALayers)

UIImage 遮罩在 iPhone 上提供黑色背景(而不是在模拟器中)

为啥 -drawRect 比为 UITableViews 使用 CALayers/UIViews 更快?

在 terraform 模块中显式使用提供程序

UIView 动画与 CALayers

vegas如何上下留黑色?