2013-08-07 10 views
8

Mam ten fragment kodu, aby dać moich obrazów kolor mi potrzeba:CGContextFillRects: nieprawidłowy kontekst - Objective C

- (UIImage*)convertToMask: (UIImage *) image 
{ 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
    CGRect imageRect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // Draw a white background (for white mask) 
    CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 0.9f); 
    CGContextFillRect(ctx, imageRect); 

    // Apply the source image's alpha 
    [image drawInRect:imageRect blendMode:kCGBlendModeDestinationIn alpha:1.0f]; 

    UIImage* outImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return outImage; 
} 

wszystko działa świetnie w moim pierwszym widoku, ale kiedy dodać to do mojego widoku szczegółów, to daje mi ten błąd (nadal działa):

CGContextSetRGBFillColor: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka używa nieprawidłowego kontekstu, co przyczynia się do ogólnej degradacji stabilności i niezawodności systemu. To zawiadomienie jest uprzejmością: prosimy rozwiązać ten problem. Stanie się fatalnym błędem w nadchodzącej aktualizacji.

CGContextFillRects: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub biblioteka, której używa, używa nieprawidłowego kontekstu i jest przyczyniając się w ten sposób do ogólnej degradacji stabilności systemu i niezawodności. To zawiadomienie jest uprzejmością: prosimy rozwiązać ten problem. To stanie się krytycznym błędem w nadchodzącej aktualizacji.

Każdy pomysł, jak pozbyć się tego błędu?

Dzięki.

EDYTOWANIE:

Akcja została wywołana z brakiem obrazu. Z łatwością naprawiłem to, dodając warunek. Dzięki @ipmcc za komentarz.

- (UIImage*)convertToMask: (UIImage *) image 
{ 

    if (image != nil) { 

     UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
     CGRect imageRect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 

     CGContextRef ctx = UIGraphicsGetCurrentContext(); 

     // Draw a white background (for white mask) 
     CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 0.9f); 
     CGContextFillRect(ctx, imageRect); 

     // Apply the source image's alpha 
     [image drawInRect:imageRect blendMode:kCGBlendModeDestinationIn alpha:1.0f]; 

     UIImage* outImage = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 

     return outImage; 

    }else{ 

     return image; 

    } 
} 
+1

Trzecie identyczne pytanie za dwa dni, drugie dzisiaj. –

+1

Czy Twój obraz 'nil'? IIRC, kontekst będzie "zerowy", jeśli przekażesz 0 dla wysokości, szerokości lub skali do "UIGraphicsBeginImageContextWithOptions". – ipmcc

+0

@ipmcc Tak, z jakiegoś powodu metoda została wywołana raz z zerowym obrazem. Usunięcie warunku było łatwe. To działało na mój pierwszy widok, więc nie przyszło mi to do głowy. Dzięki – adam

Odpowiedz

8

Spróbuj tego: w Xcode dodać symboliczną przerwania do CGPostError. (Dodaj symboliczny punkt przerwania i do Typ pola symbolu CGPostError)

Gdy wystąpi błąd, debugger zatrzyma wykonywanie kodu i będzie można sprawdzić stos wywołań metod i sprawdzić parametry.

0
// UIImage+MyMask.h 

@interface UIImage (MyMask) 
- (UIImage*)convertToMask; 
@end 

// UIImage+MyMask.m 

@implementation UIImage (MyMask) 
- (UIImage*)convertToMask 
{ 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); 
    CGRect imageRect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // Draw a white background (for white mask) 
    CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 0.9f); 
    CGContextFillRect(ctx, imageRect); 

    // Apply the source image's alpha 
    [image drawInRect:imageRect blendMode:kCGBlendModeDestinationIn alpha:1.0f]; 

    UIImage* outImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return outImage; 
} 
@end 

Następnie można wywołać tak (Nie ma potrzeby sprawdzania nil):

UIImage *maskImage = [someImage convertToMask]; 
0

co wiem, to zadzwonić UIGraphicsBeginImageContextWithOptions z size.width lub size.height 0

tylko dodać symboliczny punkt przerwania do CGPostError, aby sprawdzić.