所以你很好,你已经弄清楚了这里的事情,但你对自己的问题的答案有一些不准确的地方。让我纠正几件事:
框架属性可以被动画 - 只是没有显式动画。如果您做以下不是一个视图的根层的层,框架将动画就好了:
[CATransaction begin];
[CATransaction setAnimationDuration:2.0f];
[animationLayer setFrame:CGRectMake(100.0f, 100.0f, 100.0f, 100.0f)];
[CATransaction commit];
记住一个层上设置属性将动画默认该属性的变化。事实上,如果你不想让它动起来,你必须禁用属性更改的动画。 (当然,这只有在您为视图的根层以外的其他图层设置动画时才是如此。)如果您需要使用显式动画,则在动画设置位置和边界时是正确的。
您使用隐式动画可以动画上一个UIView帧:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:3.0f];
[[self view] setFrame:CGRectMake(45.0f, 45.0f, 100.0f, 100.0f)];
[UIView commitAnimations];
这将从该视图的当前帧的动画(边界和位置)至x = 45.0,Y = 45.0,W = 100.0 ,h = 100.0。
看来你也可能会误解动画和图层之间的区别。您将动画添加到图层,但向图层添加动画不会自动设置您正在动画的属性。
CALayers是模型对象。它们包含关于最终渲染到屏幕的图层的信息。如果您希望该属性实际上具有该值,则您必须必须设置图层的属性。如果您只是为属性设置动画效果,那么它只会是一种可视化表示,而不是实际的 - 也就是说,这就是为什么值会快速恢复到图层的原始值,因为您从未真正改变过它。
这导致我到下一个点。你说:
使用 “animation.removedOnCompletion = NO; animation.fillMode = kCAFillModeForwards;”确保 值不会在动画
这结束 reseted是不完全正确的。这两个值只是简单地使动画保持在最终位置可视,但是,该图层的实际值没有改变。它们仍然与开始动画时的值完全相同。一般情况下(除少数例外),您不想使用这两个参数,因为它们只是只可视为。你想要的是实际设置你的动画属性的图层值。
举例来说,你想要使用明确的动画来动画你的图层的位置。这里是你想要的代码:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setFromValue:[NSValue valueWithCGPoint:CGPointMake(70.0f, 70.0f)]];
[animation setToValue:[NSValue valueWithCGPoint:CGPointMake(150.0f, 150.0f)]];
[animation setDuration:2.0f];
// Actually set the position on the *layer* that you want it to be
// when the animation finishes.
[animationLayer setPosition:CGPointMake(150.0f, 150.0f)];
// Add the animation for the position key to ensure that you
// override the animation for position changes with your animation.
[animationLayer addAnimation:animation forKey:@"position"];
你可能还想考虑动画分组。通过动画组,您可以将多个动画组合在一起,然后控制它们之间的相互关系。在你的情况下,你的界限和位置动画的持续时间是相同的,所以你试图做的没有一个组会工作得很好,但是如果你想抵消动画的开始,例如你不想要位置动画开始,直到第二个或第二个进入框架动画,您可以通过设置beginTime位置动画的值来错开它们。
最后,我很想知道为什么你不能使用UIView提供的隐式动画。我在绝大多数我写的Core Animation代码中使用这些代码,并且无法明白为什么这不适合您的情况。
此致敬礼。
感谢您的解释马特。但对于UIView动画问题,它仅与我的图层有关。通常,我使用UIView的动画没有问题,但在我的情况下,它造成了奇怪的行为。调整视图框的大小并不会调整iPhone的图层大小(因为iPhone上没有自动机制,仅适用于视图和子视图)。所以,你必须“手动”。 – Sauleil 2010-07-21 14:00:14
好的答案!很详细。如果可以的话,我会给你2分。 – Soberman 2016-01-18 22:26:12