ios开发push,IOS开发者模式

iOS 转场动画:以Push方式实现Present跳转

在iOS开发中,页面跳转一般有两种方式:

目前成都创新互联公司已为成百上千家的企业提供了网站建设、域名、网站空间绵阳服务器托管、企业网站设计、郑州网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

在SDK开发中,由于需要减小侵入性,通常会使用modal方式弹出SDK的页面,那么默认唤起的动画就是从下到上。现在有一个需求,需要从右到左唤起SDK的页面,所以我们需要用到转场动画,将present的动画改成从右到左,也就是以Push方式实现Present跳转。

实现模态的转场动画的步骤,大概分以下几步:

下面按照这个步骤来实现功能

创建一个类 WBHCPushAnimatedTransition 来封装转场动画

实现系统的 UIViewControllerAnimatedTransitioning 协议

实现present动画,实际就是使用UIView动画来改变 fromVC 和 toVC 的 view 的位置

实现dismiss动画,和上面的present动画相反,将fromVC 和 toVC 的 view 的位置还原

这样,整个转场动画的封装就完成了,下面来实现代理

在要present出来的vc中实现系统代理 UIViewControllerTransitioningDelegate

这样的话,整个功能就基本实现了

但是,体验上还缺少一点:没有侧滑返回。所以,接下来,我们实现侧滑返回的交互转场

创建一个继承自 UIPercentDrivenInteractiveTransition 的类 WBHCPopInteractiveTransition 来封装交互转场

为传入的vc添加拖动手势

拖动手势是加在全屏上的,我们需要将它限制到屏幕左侧,这样才是侧滑返回,否则是全屏返回

核心是处理手势交互转场的过程,我们需要更新转场百分比 updateInteractiveTransition ,标记 完成转场 finishInteractiveTransition 和取消转场 cancelInteractiveTransition

这样,整个交互转场的封装就完成了,下面来实现代理

在要dismiss消失的vc中实现系统代理 UIViewControllerTransitioningDelegate

这样的话,整个侧滑返回的功能就实现了

至此,我们基本上就实现了以Push方式实现Present跳转,同时可以像原生导航一样进行侧滑返回

iOS实现先无动画pop再push,替换当前控制器

iOS实现先无动画pop再push,替换当前控制器

1.先pop 发送通知或代理在前一个页面执行push操作

iOS开发中会遇到添加成功,发送成功……类似情况,需要先将push前的页面移除调。如果直接调用pop,立刻去push。如果这两个命令写在同一个控制器中,则会发现push根本没有被执行……因为pop已经将该控制器移除,push根本没有机会执行。也可以在上一个控制器通过代理/通知/闭包等操作。

这种方法有弊端,有可能会push多次不等。页面交互非常不好。

2.改变控制器在栈中的位置

所以就选择了下面的方法,先移除路由栈中当前控制器,再新增新的控制器,最后赋值。

iOS开发 导航栏出现多次push同一个页面问题解决办法

在点击push下一个页面时,因为各种原因,点一下cell或按钮没有响应,用户可能就多点几下,这时候会打开好几个一样的页面。

这是因为push后的页面有耗时操作或者刚好push到另一个页面时,另一个页面正好在reloadData卡住主线程。造成点击cell时卡住了。

这时,我们可以通过重写导航控制器的方法来解决这个问题。

#import UIKit/UIKit.h

@interfaceNaviViewController : UINavigationController

@end

#import "NaviViewController.h"

@interfaceNaviViewController ()

// 记录push标志

@property(nonatomic,getter=isPushing)BOOLpushing;

@end

@implementationNaviViewController

- (void)viewDidLoad {

      [superviewDidLoad];

       self.delegate=self;

}

- (void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated {

    if(self.pushing==YES) {

             NSLog(@"被拦截");

             return;

    }else{

             NSLog(@"push");

             self.pushing=YES;

    }

[superpushViewController:viewControlleranimated:animated];

}

#pragma mark - UINavigationControllerDelegate

-(void)navigationController:(UINavigationController*)navigationControllerdidShowViewController:(UIViewController*)viewControlleranimated:(BOOL)animated {

         self.pushing=NO;

}

@end


网站名称:ios开发push,IOS开发者模式
当前路径:http://azwzsj.com/article/hojpip.html