2010-07-29 14 views
5

Mam aplikację z niestandardową podklasą CALayer. W podklasie tej warstwy nadpisałem metodę - (void) drawInContext:(CGContextRef)ctx. Działa to dobrze i cała moja niestandardowa zawartość jest rysowana.CALayer nie rysuje swojej zawartości podczas używania CABasicAnimation.

Teraz chciałem dodać właściwość niestandardową, która zostanie animowana po zmianie treści. Muszę przerysować, gdy animacja jest uruchomiona. Dodałem właściwość jak podano w odpowiedzi na następujące pytanie: Animating a custom property of CALayer subclass

I ja również dodać instancję CABasicAnimation tej właściwości do mojego warstwy:

CABasicAnimation* theAnimation=[CABasicAnimation animationWithKeyPath:@"moveContentToLeft"]; 
theAnimation.duration=1.0; 
theAnimation.fromValue=[NSNumber numberWithFloat:0.0]; 
theAnimation.toValue=[NSNumber numberWithFloat:10.0]; 
[area addAnimation:theAnimation forKey:@"moveContentToLeft"]; 

W mojej metody losowania mam oświadczenie NSLog w które generuję wartość mojej własności, którą animuję.

Mój problem polega na tym, że zaraz po uruchomieniu animacji cała zawartość podklasy warstw zostanie wyczyszczona. NSLog wyprowadza wartości mojej właściwości, która jest interpolowana (tak wywoływana jest metoda drawInContext). Ale jakoś to, co rysuje, nie jest widoczne podczas animacji. Pod koniec animacji oryginalna zawartość staje się ponownie widoczna.

W tej chwili animowana właściwość nie jest jeszcze używana podczas rysowania warstwy, więc oczekiwałbym, że normalna zawartość zostanie ponownie narysowana i otrzymam wynik NSLog z interpolowanymi wartościami.

Moja warstwa jest potomkiem innej warstwy (wewnątrz UIView). Próbowałem przerysować superwarstwę na końcu metody rysowania (z wywołaniem _parent setNeedsDisplay [parent jest avar do widoku nadrzędnego]). To nie pomogło. Mam też wrażenie, że nie jest to dobry pomysł.

Mam nadzieję, że ktoś może mi pomóc w rozwiązaniu tego problemu.

Aktualizacja

Dzięki przykładowym projekcie od Matt Long widziałam, że mój problem leży wewnątrz metody rysowania. Przedłużyłem jego projekt, aby pokazać ten sam problem. Myślę, że łatwiej jest pokazać niż oryginalnego kodu;)

- (void)drawInContext:(CGContextRef)ctx 
{ 
    NSLog(@"Getting called: Bob: %i", [self bob]); 

    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathAddRect(path, NULL, CGRectMake(50 + [self bob], 50, 100, 100)); 
    CGContextAddPath(ctx, path); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor); 
    CGContextSetLineWidth(ctx, 1.0); 
    CGContextStrokePath(ctx); 
    CGPathRelease(path); 

    [_test testInContext:ctx]; // here is the problem 
} 

Ivar _test jest niestandardowej klasy, która zawiera trochę kodu rysowania (w tej chwili rysuje zielona ramka). Problem polega na tym, że to zielone pole nie zostanie narysowane podczas animacji. Jak tylko animacja się zakończy, zielone pole znów będzie widoczne. Rozszerzony przykładowy projekt: http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip

+0

Myślę, że może to pomóc, aby pokazać kod rysunku oprócz kodu animacji. Wygląda na to, że kod animacji nie zawiera niczego złego. –

+0

To pytanie było odpowiedzią na moje pytanie, dziękuję;) –

+0

Mam ten sam problem, naprawiłem go. [Tutaj] (http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) –

Odpowiedz

1

Trudno powiedzieć, co się dzieje, nie widząc więcej kodu. Mam przykładową aplikację, która animuje niestandardową właściwość i położenie warstwy w tym samym czasie. Możesz take a look at my source i zobaczyć, co jest inne.

+0

Dziękujemy za przykładowy kod. Rozszerzyłem go tak, aby zachowywał się tak samo jak mój kod (zobacz moje pytanie). – Chris

+0

Prawdziwe pytanie w tym miejscu brzmi: co próbujesz zrobić? Przyjrzałem się zmianom w twoim kodzie, ale nie potrafię wyobrazić sobie, jak sobie życzysz. Jeśli próbujesz animować kilka prostokątów, nie ma absolutnie żadnego powodu, aby narysować to samemu. Powinieneś po prostu dodawać swoje dwa prostokąty jako warstwy i animować ich pozycje, jak pokazany przykładowy kod.Twoja własność niestandardowa jest zupełnie niepotrzebna. Więc co próbujesz zrobić ponownie? –

Powiązane problemy