2010-04-03 10 views
7

Oto kod używam rysować:Dlaczego występuje niepoprawny błąd kontekstu?

- (void) drawSomething 
{ 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1); 
    CGContextSetLineWidth(context, 6.0); 

    CGContextMoveToPoint(context, 100.0f, 100.0f); 
    CGContextAddLineToPoint(context, 200.0f, 200.0f); 
    CGContextStrokePath(context); 

    NSLog(@"draw"); 

} 

Ale mam błąd jak poniżej:

[Session started at 2010-04-03 17:51:07 +0800.] 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextSetRGBStrokeColor: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextSetLineWidth: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextMoveToPoint: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextAddLineToPoint: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextDrawPath: invalid context 

Dlaczego poprosi mnie powiedzieć, że kontekst jest inwalidę?

+0

Z czego dzwonisz czerpiąc coś? Jaki powinien być obecny kontekst? –

+0

to wywoływane z mojej metody init. bieżący kontekst nie jest bieżącym widokiem? – Tattat

Odpowiedz

12

Jak the documentation mówi:

Obecny kontekst graficzny jest zerowa domyślnie. Przed wywołaniem metody drawRect: view obiekty wyświetlają poprawny kontekst na stosie, czyniąc go bieżącym.

Więc trzeba umieścić ten kod w metodzie drawRect

+0

nadal nie rozumiem tego, że – Tattat

+4

System operacyjny iPhone OS jest tak zbudowany, że kontekst graficzny (dostępny dla nas poprzez UIGraphicsGetCurrentContext()) jest tworzony tylko wtedy, gdy jest potrzebny. Jest to potrzebne, gdy chcesz narysować coś, więc w drawRect: methode będziesz nadpisywać w swojej klasie. Nawet jeśli możesz zadzwonić bezpośrednio drawRect :, dokumentacja pakietu iPhone SDK radzi ci, aby tego nie robić. Zamiast więc zmienić nazwę metody drawSomething: to drawRect: i wywołanie go, co by działało, radzę ci to zrobić, ale zadzwoń setNeedsDisplay, jak @Brad Larson powiedział ci, aby;) –

+0

thz faceci, jesteście bardzo pomocni. – Tattat

8

Od my answer do this similar question:

Jeśli to ma być rysowane na ekranie, trzeba znaleźć swój kod rysowania wewnątrz metoda UIView (lub –drawInContext: z CALayer). Aby zaktualizować jego zawartość, musisz zadzwonić pod numer -setNeedsDisplay w UIView lub CALayer. Próba rysowania w dowolnym innym czasie spowoduje błąd "nieprawidłowy kontekst", który widzisz.

Zobacz także this question.

Powiązane problemy