Изменения, внесенные в представления, вступают в силу в конце текущего цикла выполнения.То же самое касается любой анимации, примененной к слоям.
Если вы анимируете слой представления, само представление не изменяется, поэтому представление, по-видимому, возвращается к своей исходной позиции после завершения анимации.
Имея в виду эти две вещи, выВы можете получить желаемый эффект, установив кадр представления таким, каким вы хотите его видеть, когда анимация будет завершена, а затем добавив явную анимацию к слою представления.
Когда анимация начинается, она перемещает вид наначальная позиция, анимирует ее до конечной позиции, и когда анимация завершена, представление имеет заданную вами рамку.
- (IBAction)animateTheView:(id)sender
{
// Calculate start and end points.
NSPoint startPoint = theView.frame.origin;
NSPoint endPoint = <Some other point>;
// We can set the frame here because the changes we make aren't actually
// visible until this pass through the run loop is done.
// Furthermore, this change to the view's frame won't be visible until
// after the animation below is finished.
NSRect frame = theView.frame;
frame.origin = endPoint;
theView.frame = frame;
// Add explicit animation from start point to end point.
// Again, the animation doesn't start immediately. It starts when this
// pass through the run loop is done.
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setFromValue:[NSValue valueWithPoint:startPoint]];
[animation setToValue:[NSValue valueWithPoint:endPoint]];
// Set any other properties you want, such as the delegate.
[theView.layer addAnimation:animation forKey:@"position"];
}
Конечно, чтобы этот код работал, вам нужно убедиться, что оба видаи его суперпредставление имеет слои.Если в суперпредставлении нет слоя, вы получите поврежденную графику.