iOS 不使用UINavigationController实现Push动画

转自廖雪峰

在iOS开发中,如果使用UINavigationController,配合Storyboard+Push模式的Segue,默认情况下,可以直接实现左右推出的View切换效果。

但是,如果不使用UINavigationController时,把Segue设置为Push,运行就会直接报错,而Model模式的Segue只有Cover Vertical,Flip Horizontal,Cross Dissolve和Partial Curl这4种模式,没有Push模式。

如果要在自定义的View切换动画中使用Push模式,唯一的方法是把Segue设置为Custom,然后自定义Push动画。

自定义View切换动画效果的实现方式是从UIStoryboardSegue派生一个类,然后在-(void)perform方法中自己实现动画。

经过多次Google,找到多种实现方式,经比较后发现,最简单最靠谱的Push动画实现如下:

- (void)perform
{
    UIViewController* source = (UIViewController *)self.sourceViewController;
    UIViewController* destination = (UIViewController *)self.destinationViewController;

    CGRect sourceFrame = source.view.frame;
    sourceFrame.origin.x = -sourceFrame.size.width;

    CGRect destFrame = destination.view.frame;
    destFrame.origin.x = destination.view.frame.size.width;
    destination.view.frame = destFrame;

    destFrame.origin.x = 0;
    [source.view.superview addSubview:destination.view];
    [UIView animateWithDuration:.25
                     animations:^{
                         source.view.frame = sourceFrame;
                         destination.view.frame = destFrame;
                     }
                     completion:^(BOOL finished) {
                         [source presentViewController:destination animated:NO completion:nil];
                     }];
}

以上就是从右向左切换View动画的实现,关键代码是:

sourceFrame.origin.x = -sourceFrame.size.width;

destFrame.origin.x = destination.view.frame.size.width;

将旧的View向左移动,新的View从最右开始进入。

最后,在动画结束后,手动将当前View切换到新的View:

[source presentViewController:destination animated:NO completion:nil];

因为动画效果我们已经自己实现了,所以切换到新的View就不要使用动画了。

简单修改上面的代码,就可以实现从左到右的Push切换动画:

CGRect sourceFrame = source.view.frame;
sourceFrame.origin.x = sourceFrame.size.width;

CGRect destFrame = destination.view.frame;
destFrame.origin.x = -destination.view.frame.size.width;
destination.view.frame = destFrame;

利用Custom模式的Segue,可以实现任意切换动画效果,对于简单的非3D动画,简单的几行代码即可实现。

时间: 2024-11-06 09:49:54

iOS 不使用UINavigationController实现Push动画的相关文章

ios开发:UINavigationController反方向滑动push

新建个UINavigationController的类别: #import "UINavigationController+CustomAnimation.h" @implementation UINavigationController (CustomAnimation) - (void)customPushViewController:(UIViewController *)viewController { viewController.view.frame = (CGRect){

swift详解之二十七------------自定义UINavigationController的push和pop动画

自定义UINavigationController的push和pop动画 我们这里先创建一个简单的工程 , 在storyboard 中拖一个导航控制器 , rootViewController 改成我们的ViewController . 为了实现自定义动画切换 , 我们需要实现两个协议 . UIViewControllerAnimatedTransitioning,UINavigationControllerDelegate UIViewControllerAnimatedTransitioni

ios导航控制器UINavigationController,控制器a跳转(push)到b后,b跳转(push)到c,但c后退(pop)进入a

参考:StackOverflow ios导航控制器UINavigationController,控制器a跳转(push)到b后,b跳转(push)到c,但c后退(pop)进入a.在b跳转(push)到c中代码书写如下: UINavigationController *navController = [[self.navigationController retain] autorelease]; [navController popViewControllerAnimated:NO]; View

自定义Tabbar实现push动画隐藏效果

在之前的一篇文章(链接)中我写到了没有用UITabbarController来实现一个自定义Tabbar,当然功能也简陋了点.注意到在Weico或微信中的自定义tabbar有一个这样的功能:push到下一个页面时tabbar会被自动隐藏,下面我就来说说如何使我前面做的自定义tabbar也能实现隐藏. 如果是原生的tabbar,这个功能实现很容易.在iOS中,每个UIViewController都有一个属性hidesBottomBarWhenPushed,每次push一个viewControlle

实现push动画的自定义

1. more第一版 实现基础功能,显示每一页固定24行文本,"q Enter"退出, "Enter" 下一行, "space Enter"下一页. /************************************************************************* > File Name: more01.c > Author: qianlv > Mail: [email protected] &

ios点击进去去除push红点的方法

ios点击进去去除push红点的方法 by 伍雪颖 [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

1.RootView 跳到SecondView 首先我们需要新一个View.新建SecondView,按住Command键然后按N,弹出新建页面,我们新建SecondView 2.为Button 添加点击事件,实现跳转 在RootViewController.xib中和RootViewController.h文件建立连接 在RootViewController.m中实现代码,alloc一个SecondViewController,用pushViewController到navigationCon

iOS学习之UINavigationController详解与使用(三)ToolBar

1.显示Toolbar  在RootViewController.m的- (void)viewDidLoad方法中添加代码,这样Toobar就显示出来了. [cpp] view plaincopyprint? [self.navigationController  setToolbarHidden:NO animated:YES]; [self.navigationController setToolbarHidden:NO animated:YES]; 2.在ToolBar上添加UIBarBu

关于push动画中尺寸问题

由于是在sb中写的VC, 所以在跳转动画时, 就会有一些问题. 这是sb中的约束: 当在push动画时, 在中间界面添加imageView时, 如图: imageView的尺寸是如上图所示, 并不是屏幕宽, 这应该是约束的问题. 效果如下: 如果换成view, 就可以了. 虽然打印时尺寸还和上面的一样, 但是, 实际上是正确的: