在UIView子类中使用的CAShapeLayer不起作用

我试了几个小时,用CAShapeLayer在我的UIView周围得到了一个虚线的边框,但我没有得到它显示。
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; } 

我在我的Superview中绘制了一个红色矩形,但不是边界。 从一个源代码复制这个例子,希望它可以工作,但事实并非如此。

你永远不会添加shapeLayer作为你的UIView图层的子图层,所以它永远不会显示在屏幕上。 尝试添加

 [self.layer addSublayer:shapeLayer_]; 

在你的-initWithFrame -initWithFrame:方法中设置你的CAShapeLayer之后。

更好的是,你可以通过覆盖下面的类方法来让你的UIView的支持图层成为一个CAShapeLayer:

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

然后,您可以直接处理视图的图层,并消除额外的CAShapeLayer实例variables。