CAShapeLayer used in UIView subclass doesn't work

10,844

You never add shapeLayer as a sublayer of your UIView's layer, so it's never displayed onscreen. Try adding

[self.layer addSublayer:shapeLayer_];

after you set up your CAShapeLayer in your -initWithFrame: method.

Even better, you could try making your UIView's backing layer a CAShapeLayer by overriding the following class method:

+ (Class) layerClass 
{
    return [CAShapeLayer class];
}

You could then deal with the view's layer directly, and eliminate the additional CAShapeLayer instance variable.

Share:
10,844
Seega
Author by

Seega

Updated on August 06, 2022

Comments

  • Seega
    Seega almost 2 years

    i tried a few hours to get a dotted border around my UIView with CAShapeLayer but i don't get it displayed.
    ScaleOverlay.h

    #import <UIKit/UIKit.h>
    #import <QuartzCore/QuartzCore.h>
    
    @interface ScaleOverlay : UIView <UIGestureRecognizerDelegate> {
        CAShapeLayer *shapeLayer_;
    }
    @end
    

    ScaleOverlay.m

    - (id)initWithFrame:(CGRect)frame
    {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor redColor];
        self.alpha = 0;
        //Round corners
        [[self layer] setCornerRadius:8.f];
        [[self layer] setMasksToBounds:YES];
        //Border
        shapeLayer_ = [[CAShapeLayer layer] retain];
    
        CGMutablePathRef path = CGPathCreateMutable();
        CGPathAddRect(path, NULL, frame);
        shapeLayer_.path = path;
        CGPathRelease(path);
        shapeLayer_.backgroundColor = [[UIColor clearColor] CGColor];
        shapeLayer_.frame = frame;
        shapeLayer_.position = self.center;
    
        [shapeLayer_ setValue:[NSNumber numberWithBool:NO] forKey:@"isCircle"];
        shapeLayer_.fillColor = [[UIColor blueColor] CGColor];
        shapeLayer_.strokeColor = [[UIColor blackColor] CGColor];
        shapeLayer_.lineWidth = 4.;
        shapeLayer_.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:8], [NSNumber numberWithInt:8], nil];
        shapeLayer_.lineCap = kCALineCapRound;
    }
    return self;
    }
    

    I got a red rect drawn in my Superview but not the border. Copied this from a source example in the hope it would work, but it doesn't.

  • Seega
    Seega about 13 years
    can't believe i forgot [self.layer addSublayer:shapeLayer_]; and searched to days for it
  • openfrog
    openfrog about 11 years
    You can't use CAShapeLayer as backing layer for some reason.
  • Tyten
    Tyten about 7 years
    @LucasTizma same here.