我正在尝试交叉动画(在我的示例中是自定义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 时,淡入淡出确实有用。)
为什么会这样?
答案 0 :(得分:0)
为什么不在视图上使用.transform
属性?我已经用它来创建各种缩放/淡入淡出/拉伸/翻转过渡,它可以与[UIView animateWithDuration:]
一起使用。
如果您坚持使用图层,请注意animateWithDuration:
不会在封面下使用CALayer
动画,因此至少会与其他动画相隔几帧。
答案 1 :(得分:-1)
我有一个类似的问题,选项UIViewAnimationOptionAllowAnimatedContent
为我工作。