UIView在其图层动画后显示不正确

时间:2010-06-21 16:34:36

标签: ios cocoa-touch uikit core-animation

我有一个问题,我不了解UIViews和核心动画。这就是我想要做的事情:

  • 通过将其作为其子视图之一,在较大视图上方显示小视图。
  • 当我单击此视图中的按钮时,视图应最小化并移动到指定的CGRect。
  • 然后从超级视图中删除视图。

我第一次出现,最小化 - 移动和删除视图,一切正常。但是当我再次呈现视图时,它会显示在修改后的位置(即使它应该通过调用theView.frame = CGRectMake(600.0, 160.0, 339.0, 327.0);设置在原始位置),同时显示所有不同的响应元素(按钮,文本视图等)。 )视图中包含的行为就好像它们处于原始位置一样。这就像视图和图层被动画不同步,我不知道如何让它们恢复同步。

拥有类似self.view.layer.frame = CGRectMake(600.0, 160.0, 339.0, 327.0);之类的内容并不合适。

我的最小化和移动动画代码如下:

    [CATransaction flush];
    CABasicAnimation *scale, *translateX, *translateY; 
    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.delegate = delegate; 
    group.duration = duration; 

    scale = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
    translateX = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
    translateY = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 

    scale.toValue = [NSNumber numberWithFloat:0.13];
    translateX.toValue = [NSNumber numberWithFloat:137.0];
    translateY.toValue = [NSNumber numberWithFloat:-290.0];

    group.animations = [NSArray arrayWithObjects: scale, translateX, translateY, nil];
    group.fillMode = kCAFillModeForwards; 
    group.removedOnCompletion = NO;

    [theView.layer addAnimation:group forKey:@"MyAnimation"];

如何在动画后将图层恢复到视图?

1 个答案:

答案 0 :(得分:2)

如果删除这两行会怎样?

group.fillMode = kCAFillModeForwards; 
group.removedOnCompletion = NO;

你用这些线告诉核心动画的是你希望它在动画的前进(最终)状态下继续显示。同时,您实际上没有在图层上设置变换以具有您用于动画的属性。这会使事情看起来不同步。

现在,您将要遇到的问题是删除这些行会导致转换在动画完成时恢复到启动状态。您需要做的是实际在图层上设置变换,以便在动画完成时保持它们的位置。

另一种选择是将两条线留下,然后实际上从图层中显式删除动画,而不是像您在准备恢复到原始状态时所提到的那样设置图层框。你这样做:

[theView.layer removeAnimationForKey:@"MyAnimation"];

-removedOnCompletion属性告诉图层在完成时不要删除动画。现在你可以明确地删除它,它应该还原。

HTH。