我正在尝试构建一个使用图层的应用程序,我的应用程序结构是
UIView --> UIScrollView --> UIView --> LayersView (Custom UIView)
--> UIImageView
我想向 LayersView 添加多个图层,因此我构建了一个CALayer
用于UIBezierPath
绘制一组点的自定义。
CALayerBezierPath.h
#import <QuartzCore/QuartzCore.h>
@interface CALayerBezierPath : CALayer {
NSMutableArray *pointsArray;
}
@property (nonatomic, retain) NSMutableArray *pointsArray;
- (void) initVariables;
- (void) addNewPoints:(CGPoint)newPoint;
@end
CALayerBezierPath.m
#import "CALayerBezierPath.h"
@implementation CALayerBezierPath
@dynamic pointsArray;
-(void)drawInContext:(CGContextRef)ctx {
NSLog(@"CALayerBezierPath - drawInContext");
if ([pointsArray count] > 0) {
UIColor *color = [UIColor redColor];
[color set];
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:[[pointsArray objectAtIndex:0] CGPointValue]];
for (int x = 1; x < [pointsArray count]; x++) {
[path addLineToPoint:[[pointsArray objectAtIndex:x] CGPointValue]];
}
[path closePath]; // Implicitly does a line between p4 and p1
[path fill]; // If you want it filled, or...
[path stroke]; // ...if you want to draw the outline.
}
}
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
NSLog(@"drawLayer");// It's never called, i don't know why
}
- (void) initVariables {
pointsArray = [[NSMutableArray alloc] init];
}
- (void) addNewPoints:(CGPoint)newPoint {
[pointsArray addObject:[NSValue valueWithCGPoint:newPoint]];
}
@end
当我在我的 LayrsView 中启动一个新层时,我正在使用以下代码:
self.layer.backgroundColor = [UIColor whiteColor].CGColor;
self.layer.cornerRadius = 20.0;
self.layer.frame = CGRectInset(self.layer.frame, 0, 0);
for (PlansClass *pclass in layersContent) {
CALayerBezierPath *sublayer = [CALayerBezierPath layer];
[sublayer initVariables];
NSDictionary* json = [pclass.listOfPoints objectFromJSONString];
float largerX = 0; float largerY = 0;
float smallerX = 10000; float smallerY = 10000;
for (NSDictionary *dic in json) {
[sublayer addNewPoints:CGPointMake([[[json objectForKey:dic] objectForKey:@"x"] floatValue], [[[json objectForKey:dic] objectForKey:@"y"] floatValue])];
if (largerX < [[[json objectForKey:dic] objectForKey:@"x"] floatValue]) {
largerX = [[[json objectForKey:dic] objectForKey:@"x"] floatValue];
}
if (smallerX > [[[json objectForKey:dic] objectForKey:@"x"] floatValue]) {
smallerX = [[[json objectForKey:dic] objectForKey:@"x"] floatValue];
}
if (largerY < [[[json objectForKey:dic] objectForKey:@"y"] floatValue]) {
largerY = [[[json objectForKey:dic] objectForKey:@"y"] floatValue];
}
if (smallerY > [[[json objectForKey:dic] objectForKey:@"y"] floatValue]) {
smallerY = [[[json objectForKey:dic] objectForKey:@"y"] floatValue];
}
}
sublayer.frame = CGRectMake(smallerX, smallerY, largerX - smallerX, largerY - smallerY);
sublayer.backgroundColor = [UIColor redColor].CGColor;
[self.layer addSublayer:sublayer];
[sublayer setNeedsDisplay];
}
问题是每当应用程序午餐时,它都会给我这个错误:
2012-09-13 08:05:47.648 abcd[20744:707] CALayerBezierPath - drawInContext
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetFillColorWithColor: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSaveGState: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetFlatness: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextAddPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextDrawPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextRestoreGState: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSaveGState: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetLineWidth: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetLineJoin: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetLineCap: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetMiterLimit: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextSetFlatness: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextAddPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextDrawPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] <Error>: CGContextRestoreGState: invalid context 0x0
另外,我尝试NSLog
了ctx
indrawInContext
方法,它给了我这个:
2012-09-13 08:05:47.650 abcd[20744:707] <CGContext 0x15d950>
那么,问题出在哪里,为什么上下文无效,为什么我不能在我的自定义中绘制CALayer
?