gpt4 book ai didi

ios5 - 自定义 CALayer - 无效的上下文 0x0

转载 作者:行者123 更新时间:2023-12-03 18:23:32 25 4
gpt4 key购买 nike

我正在尝试构建一个使用层的应用程序,我的应用程序结构是

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 ctxdrawInContext方法,它给了我这个:
2012-09-13 08:05:47.650 abcd[20744:707] <CGContext 0x15d950>

那么,问题出在哪里,为什么上下文无效,为什么我不能在我的自定义中绘制 CALayer ?

最佳答案

问题是我没有推送上下文 ctx ,我正在尝试推送和弹出。所以解决方案就像把这一行放在 drawInContext 的 if 语句中一样简单。

UIGraphicsPushContext(ctx);

一切正常。

关于ios5 - 自定义 CALayer - 无效的上下文 0x0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12400581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com