Ich habe die folgende Methode von ViewDidLoad aufgerufen. Diese Methode erstellt einen CALayer, um ein Bild anzuzeigen. Diese Ebene hat eine Maske, deren Pfad ein UIBezierPath ist, der von meiner privaten Methode erstellt wurde. Ich möchte, dass sich die Maske unendlich dreht, und dann füge ich ein CABasicAnimation-Objekt zur Maske hinzu.Warum addAnimation: forKey funktioniert nicht in viewDidLoaded
- (void) createPathLmask
{
// mask layer
self.pathLayer = [CALayer layer];
self.pathLayer.bounds = CGRectMake(0.0, 0.0, 120, 120);
CGPoint position = self.view.layer.position;
position.y += 140;
self.pathLayer.position = position;
self.pathLayer.backgroundColor = [UIColor redColor].CGColor;
UIImage *backimage = [UIImage imageNamed:@"image2"];
self.pathLayer.contents = (__bridge id)backimage.CGImage;
self.pathLayer.contentsGravity = kCAGravityResizeAspectFill;
// mask
CAShapeLayer *mask = [CAShapeLayer layer];
mask.bounds = CGRectMake(0.0, 0.0, 120, 120);
mask.position = CGPointMake(60.0f, 60.0f);
mask.contentsGravity = kCAGravityResizeAspectFill;
mask.path = [self createBezierPathInRect:mask.bounds].CGPath;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// rotate the mask repeatedly
CABasicAnimation *animation = [CABasicAnimation animation];
animation.keyPath = @"transform.rotation";
animation.duration = 4.0f;
animation.byValue = @(M_PI * 2);
animation.repeatCount = HUGE_VALF;
[mask addAnimation:animation forKey:@"rotation_repeatedly"];
});
self.pathLayer.mask = mask;
[self.view.layer addSublayer:self.pathLayer ];
}
Ich finde, dass die Rotation Animation kann nur funktionieren, wenn ich die addAnimation setzen: forKey in den dispatch_after Block mit 1 Sekunde Verzögerung. Wenn diese Codes aus dem Block verschoben werden, wird die Maske nicht gedreht.
Es muss also etwas nicht bereit sein, wenn die Animation zum Layer in viewDidLoaded hinzugefügt wird. Ich frage mich, was noch nicht fertig ist? Gibt es ein Dokument oder eine Erklärung über die geeignete Möglichkeit, die Animation hinzuzufügen?
Vielen Dank @matt für Ihre Antwort. Und ja, Sie haben recht, der geeignete Ort, um Animationen zu Layern hinzuzufügen, kann viewWillAppear oder viewDidAppear sein. Das Dokument von addAnimation: forKey sagt, dass diese API die Animation dem Renderbaum der Ebene hinzufügen wird. Wissen Sie, ob es ein Dokument gibt, das den Lebenszyklus der Ebene (oder der Backend-Ebene von UIView) und deren Darstellungsschicht und Renderebene beschreibt? Ich habe nichts von "View Controller Programming Guide" und "Core Animation" gefunden Programmieranleitung " –
" ein Dokument, das den Lebenszyklus der Ebene (oder der Backend-Ebene von UIView) und ihrer Darstellungsschicht und Renderebene "Ich weiß nicht, was Sie mit ihrem" Lebenszyklus "meinen, beschreibt. Was genau möchten Sie wissen? Du könntest immer mein Buch lesen, nehme ich an: http://www.apeth.com/iOSBook/ch16.html http://www.apeth.com/iOSBook/ch17.html – matt
Allerdings glaube ich, dass ich dein tatsächliches beantwortet habe Frage, habe ich nicht? – matt