レイヤーを使用するアプリを作成しようとしています。アプリの構造は次のとおりです。
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
drawInContext
2012-09-13 08:05:47.650 abcd[20744:707] <CGContext 0x15d950>
では、問題はどこにありますか、コンテキストが無効であるのはなぜですか、カスタムで描画できないのはなぜCALayer
ですか?