UIView在其图层被animation后显示不正确

我有一个问题,我不明白UIViews和核心animation。 这是我想要做的:

  • 将小视图作为其子视图之一呈现在更大的视图之上。
  • 当我点击这个视图中的button时,视图应该最小化并移动到指定的CGRect。
  • 然后,视图将从其超级视图中移除。

我第一次介绍,最小化和移动并删除视图,一切工作正常。 但是当我再次呈现视图时,它会显示在修改后的位置(尽pipe它应该通过调用theView.frame = CGRectMake(600.0, 160.0, 339.0, 327.0); )来设置原始位置,而所有包含在视图中的不同响应者元素(button,文字浏览等)就像在原始位置一样。 这就像视图和图层被animation所不同步,我不知道如何让它们重新同步。

有像self.view.layer.frame = CGRectMake(600.0, 160.0, 339.0, 327.0); 没有得到任何正确的。

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

  [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"]; 

如何在animation之后将图层返回到视图?

如果你删除这两行,会发生什么?

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

用这些线条告诉核心animation的是,你希望它继续显示在animation的前进(最终)状态。 同时,您并未真正将图层上的变换设置为具有用于animation的属性。 这会使事情看起来不同步。

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

另一种方法是将两行代码放入,然后实际上将图层中的animation从图层中移除,而不是象您刚才提到的那样设置图层框架,以便恢复到原始状态。 你这样做:

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

-removedOnCompletion属性告诉图层在完成时不删除animation。 现在你可以明确的删除它,它应该恢复。

HTH。