使用 UIView 动画从 CATransition 实现 kCATransitionPush

Posted

技术标签:

【中文标题】使用 UIView 动画从 CATransition 实现 kCATransitionPush【英文标题】:Use UIView animation to implement kCATransitionPush from CATransition 【发布时间】:2011-07-24 07:59:24 【问题描述】:

Apple 建议在 ios4 及更高版本中使用 UIView 动画块 (here),但我非常喜欢我的旧 CATransition 和 kCATransitionPush 效果。如何使用 UIView 动画实现 kCATransitionPush?我在可用选项中只看到四种类型的视图转换(向左/向右翻转、向上/向下卷曲)

如果我自己实现,我打算创建一个新视图并将其滑入,同时将旧视图滑出。我不明白为什么苹果没有在 UIView 动画中包含“推送”效果。

谢谢!

狮子座

【问题讨论】:

【参考方案1】:

通过阅读您发布的苹果文档,它似乎还说:

基于块的动画方法(例如 animateWithDuration:animations:) 大大简化了 动画。通过一个方法调用,您可以指定动画为 执行和动画的选项。但是,基于块的 动画仅在 iOS 4 及更高版本中可用。如果您的应用程序 在早期版本的 iOS 上运行,您必须使用 beginAnimations:context: 和 commitAnimations 类方法来标记 动画的开始和结束。

我认为这意味着他们推荐它因为它极大地简化了动画的创建。它还指出,它不适用于任何没有 ios 4 的设备。如果你知道如何使用 CAAnimation,我会继续使用它。我仍然使用它没有任何问题:

- (void)switchTwoViews:(UIView *)view1 otherView:(UIView *)view2 direction:(int)directionRL
view2.frame = CGRectMake(0, 0, 400, 211);
visibleView = view2;
// remove the current view and replace with view1
[view1 removeFromSuperview];
[currentOptionsView addSubview:view2];

// set up an animation for the transition between the views
CATransition *animation = [CATransition animation];
[animation setDuration:0.3];
[animation setType:kCATransitionPush];
if (directionRL == 0) 
    [animation setSubtype:kCATransitionFromRight];
 else 
    [animation setSubtype:kCATransitionFromLeft];


[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

[[currentOptionsView layer] addAnimation:animation forKey:@"SwitchToView"];

【讨论】:

【参考方案2】:

该文档指的是推荐基于块的 UIView 动画,而不是使用 beginAnimationscommitAnimations 的旧 UIView 调用。它与 CATransition 无关。您可以毫无顾虑地继续使用 Core Animation。

【讨论】:

【参考方案3】:

试试下面的代码来显示视图

-(void)slideViewTransition:(UIView*)slidingView
 
  CATransition *animation = [CATransition animation];
 [animation setDuration:0.4];
 [animation setType:kCATransitionPush];
 [animation setSubtype:kCATransitionFromTop];
 [animation setTimingFunction:[CAMediaTimingFunction  functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

 [[slidingView layer] addAnimation:animation forKey:nil];

当您需要隐藏视图时,只需将 [animation setSubtype:kCATransitionFromTop] 更改为 [animation setSubtype:kCATransitionFromBottom];

希望对你有帮助..!!!

【讨论】:

【参考方案4】:

这里是一个 Swift 函数,它根据给定的标志从左/右为视图设置动画:

func animateSwipe(on view: UIView, left: Bool) 
    let transition = CATransition()
    transition.duration = 0.45
    transition.type = kCATransitionPush
    transition.subtype = left ? kCATransitionFromLeft : kCATransitionFromRight
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
    view.layer.add(transition, forKey: nil)
    // change anything you want on the view in a reload(view: UIView) function
    reload(view)

【讨论】:

以上是关于使用 UIView 动画从 CATransition 实现 kCATransitionPush的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局时如何将动画从一个 UIView 翻转到另一个?

使用 [UIView animateKeyframesWithDuration] 为 UIView 设置动画的奇怪行为

动画 UIView 从左侧而不是中心增长

动画 UIView 没有按预期工作

UIView 动画曲线减速使用 UIViewAnimationOptionCurveEaseOut

使用 NSLayoutConstraints 在 UIView 上简单滑动动画