使用 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 动画,而不是使用 beginAnimations
和 commitAnimations
的旧 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 设置动画的奇怪行为