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

Posted

技术标签:

【中文标题】UIView 在其图层动画后显示不正确【英文标题】:UIView displays improperly after its layer has been animated 【发布时间】:2010-06-21 16:34:35 【问题描述】:

我有一个关于 UIView 和核心动画的问题我不明白。这是我想做的:

通过将小视图作为其子视图之一,在大视图上方呈现小视图。 当我单击此视图内的按钮时,视图应最小化并移动到指定的 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】:

如果删除这两行会怎样?

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

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

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

另一种选择是保留两行,然后从图层中显式删除动画,而不是在准备恢复到原始状态时设置图层框架。你这样做:

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

-removedOnCompletion 属性告诉图层在动画完成时不要移除动画。现在您可以显式删除它,它应该会恢复。

HTH。

【讨论】:

哇,removeAnimationForKey: 正是我的代码中缺少的内容。谢谢,现在很好用!

以上是关于UIView 在其图层动画后显示不正确的主要内容,如果未能解决你的问题,请参考以下文章

UIView 图层未正确屏蔽

如何正确实现可拖动的“抽屉”自定义 UIView

ios:图层显示在其托管视图之外

iOS边练边学--CALayer,非根层隐式动画,钟表练习

将 UILabel 添加到 UIView 时,它的动画效果不正确

正确删除带有渐变的图层