在UIViewController转换中将CAAnimation与View Animation混合使用

时间:2014-06-25 09:30:29

标签: ios core-animation uiviewanimation

我正在尝试交叉动画(在我的示例中是自定义UIViewController转换)。想法是,在 viewControllerA 中选择UICollectionView中的单元格,添加带有alpha淡入的 viewControllerB ,并且视图 viewControllerA 包含UICollectionView放大单元格。

同样,当弹出 viewControllerB 时, viewControllerA 视图应该再次缩小,而来自 viewControllerB 的视图应该逐渐淡出。< / p>

由于这对UIView属性和CALayer属性上的动画很重要,我将核心动画与视图动画混合(如documentation中所述)。来自 viewControllerB 的视图和来自 viewControllerA 的视图都是容器视图的子视图。

代码如下:

if (_operation == ContentViewControllerOperationPush)
{
    [[toViewController view] setAlpha:0.0f];
}
else
{
    [[fromViewController view] setAlpha:1.0f];
}

id animations = ^
{
    CABasicAnimation *layerTransformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];

    [layerTransformAnimation setDuration:[self transitionDuration:transitionContext]];

    CGFloat topLayoutGuideHeight = [toViewController topLayoutGuide].length;

    CGFloat xScale = movieWidth / _transitionRect.size.width;
    CGFloat yScale = movieHeight / _transitionRect.size.height;

    CATransform3D transform = CATransform3DIdentity;
    transform = CATransform3DTranslate(transform, -[[fromViewController view] bounds].origin.x, -[[fromViewController view] bounds].origin.y, 1);
    transform = CATransform3DScale(transform, xScale, yScale, 1.0f);
    transform = CATransform3DTranslate(transform, -_transitionRect.origin.x, -_transitionRect.origin.y + topLayoutGuideHeight, 1.0f);

    if (_operation == ContentViewControllerOperationPush)
    {
        [layerTransformAnimation setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]];
        [layerTransformAnimation setToValue:[NSValue valueWithCATransform3D:transform]];

        [[[fromViewController view] layer] addAnimation:layerTransformAnimation forKey:@"layerTransformAnimation"];

        [[toViewController view] setAlpha:1.0f];
    }
    else
    {
        [layerTransformAnimation setFromValue:[NSValue valueWithCATransform3D:transform]];
        [layerTransformAnimation setToValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]];

        [[[toViewController view] layer] addAnimation:layerTransformAnimation forKey:@"layerTransformAnimation"];

        [[fromViewController view] setAlpha:0.0f];
    }
};

id completion = ^(BOOL finished)
{
    [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
};

[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:animations completion:completion];

缩放动画效果很好,但是在这种特殊情况下,alpha淡入/淡出不会在推动动画结束时将alpha弹出到1.0f(并且在弹出开始时弹出为0.0f)动画)。

(请注意,当我在按 viewControllerB 时动画 viewControllerA 的alpha而不是 viewControllerB 时,淡入淡出确实有用。)

为什么会这样?

2 个答案:

答案 0 :(得分:0)

为什么不在视图上使用.transform属性?我已经用它来创建各种缩放/淡入淡出/拉伸/翻转过渡,它可以与[UIView animateWithDuration:]一起使用。

如果您坚持使用图层,请注意animateWithDuration:不会在封面下使用CALayer动画,因此至少会与其他动画相隔几帧。

答案 1 :(得分:-1)

我有一个类似的问题,选项UIViewAnimationOptionAllowAnimatedContent为我工作。