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
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. –
To pytanie było odpowiedzią na moje pytanie, dziękuję;) –
Mam ten sam problem, naprawiłem go. [Tutaj] (http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) –