Die typische Technik ist die Verwendung einer Anzeigeverbindung (CADisplayLink
).
Also, eine Eigenschaft für die Anzeige Link definieren:
@property (nonatomic, strong) CADisplayLink *displayLink;
Und dann die Methoden implementieren zu starten, zu stoppen und zu handhaben, den Display-Link:
- (void)startDisplayLink
{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)stopDisplayLink
{
[self.displayLink invalidate];
self.displayLink = nil;
}
- (void)handleDisplayLink:(CADisplayLink *)displayLink
{
CALayer *layer = self.animatedView.layer.presentationLayer;
NSLog(@"%@", NSStringFromCGRect(layer.frame));
}
Hinweis, während eine Ansicht ist Beim Animieren können Sie nicht die grundlegenden Eigenschaften betrachten (weil es das Endziel und nicht die Position "im Flug" widerspiegelt), sondern Sie greifen auf die Ebene der animierten Ansichtsebene zu, wie oben gezeigt.
Wie auch immer, starten Sie den Display-Link, wenn Sie Ihre Animation starten. Und entferne es nach Abschluss.
Mit Standard-Block-basierte Animation, würden Sie so etwas wie zu tun:
[UIView animateWithDuration:2.0 delay:0 options:0 animations:^{
view.frame = someNewFrame;
} completion:^(BOOL finished) {
[self stopDisplayLink];
}];
[self startDisplayLink];
mit Core Animation, es könnte wie folgt aussehen:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.fromValue = [NSValue valueWithCGPoint:startPoint];
animation.toValue = [NSValue valueWithCGPoint:endPoint];
[CATransaction setAnimationDuration:1.0];
[CATransaction setCompletionBlock:^{
[self stopDisplayLink];
}];
[CATransaction begin];
[self.animatedView.layer addAnimation:animation forKey:nil];
[CATransaction commit];
[self startDisplayLink];
BTW, ich bezweifle, dass Sie daran interessiert sind, aber in UIKit Dynamics gibt es eine 'action' Blockeigenschaft auf' UIDynamicBehavior' Objekte, die genau das tut, was Sie fragen. Aber UIKit Dynamics ist (a) nur iOS 7; und (b) ist Overkill, wenn man nur die Bewegung einer Ansicht animiert. Ich erwähne es nur wegen der auffallenden Symmetrie zwischen dem, was Sie mit Ihrem 'eachTick' Block und dem' action' Block wollten. Ich denke immer noch, dass ein 'CADisplayLink' in diesem Fall wahrscheinlich mehr Sinn macht. – Rob