Вопрос по calayer, ios5, cgcontext, quartz-core – Custom CALayer - неверный контекст 0x0

4

я пытаюсь создать приложение, которое использует слои, моя структура приложения

UIView --> UIScrollView --> UIView --> LayersView (Custom UIView)
                                   --> UIImageView

Я хочу добавить несколько слоев в LayersView, поэтому ямы создаем кастомCALayer это использованиеUIBezierPath нарисовать множество точек.

CALayerBezierPath.h

#import 

@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] : CGContextSetFillColorWithColor: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSetStrokeColorWithColor: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSaveGState: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSetFlatness: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextAddPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextDrawPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextRestoreGState: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSaveGState: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSetLineWidth: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSetLineJoin: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSetLineCap: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSetMiterLimit: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextSetFlatness: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextAddPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextDrawPath: invalid context 0x0
Sep 13 08:05:47 ipad-5 abcd[20744] : CGContextRestoreGState: invalid context 0x0

Также я'мы пыталисьNSLog ctx вdrawInContext методы, и это дает мне это:

2012-09-13 08:05:47.650 abcd[20744:707] 

Итак, где проблема, почему контекст недействителен, почему я могурисовать в моем обычае?CALayer

Ваш Ответ

1   ответ
18

что ямы не делалит толкнуть контекстctxЯ пытался нажать & население поэтому решение так же просто, как положить эту строку в операторе if вdrawInContext

UIGraphicsPushContext(ctx);

Все работает.

Привет, Шрам - спасибо, что опубликовал твой ответ, сэкономил мне время. Еще одна вещь, которую нужно добавить - если вычтобы подтолкнуть вас, нужно всплыть, то есть, когда вы закончите рисование, нужно оставить существующий контекст в том же состоянии ... поэтому, где бы вы ни нажимали контекст, обязательно вызывайте UIGraphicsPopContext (); как только вы закончили рисовать. Oliver Dungey

Похожие вопросы