前言

最近接触到新公司的老项目改版。自从来了之后一直在忙另一个项目,也没有看老项目的实现逻辑。
看到设计稿的时候,并不是普通的树形标签导航的样子。大致效果如FaceU的主页:

布局类似,但是功能有点不一样:

  1. 顶部左侧的按钮点击后会出现个人中心页。
  2. 顶部中间还有个按钮,点击会出现一个业务页
  3. 顶部左侧的按钮也会出现业务页。

刚看完之后,感觉这种设计真麻烦。最爱UITabBarController+UINavgationController的CP组合好像失效的。难道只能用present来实现么。

经同事指导,最后找到Container View Controllers Quickstart,才发现一种新的转场实现方式。下面就动手实践一下。

第一步,创建项目:

创建一个空的demo project,怎么创建我就不说了。其他任何选项都不用修改,run下应该有个黑色的空白页面。

打开viewController.m创建两个UIButton:

@interface ViewController ()
@property (nonatomic, strong) UIButton *leftBtn;
@property (nonatomic, strong) UIButton *rightBtn;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];[self.view addSubview:self.leftBtn];[self.view addSubview:self.rightBtn];
}
#pragma mrk - subviews
// fram随便写的,主要看效果
- (UIButton *)leftBtn {if (_leftBtn == nil) {_leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];_leftBtn.frame = CGRectMake(0, 60, 100, 100);_leftBtn.backgroundColor = [UIColor blueColor];[_leftBtn addTarget:self action:@selector(leftAction) forControlEvents:UIControlEventTouchUpInside];}return _leftBtn;
}- (UIButton *)rightBtn {if (_rightBtn == nil) {_rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];_rightBtn.frame = CGRectMake(kScreenWidth - 100, 60, 100, 100);_rightBtn.backgroundColor = [UIColor blueColor];[_rightBtn addTarget:self action:@selector(rightAction) forControlEvents:UIControlEventTouchUpInside];}return _rightBtn;
}
@end

run起来,应该可以看到页面变成白色的,并且带有两个蓝色的色块。这两个色块就代表前言中顶部的左右按钮,点击左边的色块会从左边弹出一个控制器,右边的同理。

第二步,实现弹出控制器:

现在我们给左右按钮addTarget

- (void)leftAction {
}- (void)rightAction {
}

并创建一个左侧的控制器TestOneViewController:

- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor lightGrayColor];NSLog(@"----TestOneViewController  didload-");
}- (void)dealloc {NSLog(@"----TestOneViewController dealloc--");
}

并用NSLog来监听它的生命周期。

`viewcontroller.m中引入,并添加如下属性方法:

// 记录当前是哪个vc
@property (nonatomic, strong) UIViewController *currentVC;
@property (nonatomic, strong) TestOneViewController *leftVC;// 移除掉不活动的vc
- (void)removeInactiveVC:(UIViewController *)inActiveVC {if (inActiveVC) {[inActiveVC willMoveToParentViewController:nil];[UIView animateWithDuration:0.2 animations:^{inActiveVC.view.frame = [self dismissToFrame];} completion:^(BOOL finished) {[inActiveVC.view removeFromSuperview];[inActiveVC removeFromParentViewController];self.currentVC = nil;}];}
}
// currentVC的setter
- (void)setCurrentVC:(UIViewController *)currentVC {if (_currentVC == currentVC) {return;}[self removeInactiveVC:_currentVC];_currentVC = currentVC;[self updateActiveViewContrller];
}
// leftAction的实现
- (void)leftAction {self.currentVC = self.leftVC;
}// 更新新的vc到当前试图
- (void)updateActiveViewContrller {if (self.currentVC) {[self addChildViewController:self.currentVC];self.currentVC.view.frame = [self dismissToFrame];[self.view addSubview:self.currentVC.view];[UIView animateWithDuration:0.2 animations:^{self.currentVC.view.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);}completion:^(BOOL finished) {[self.currentVC didMoveToParentViewController:self];}];}
}
// leftVC的懒加载
- (TestOneViewController *)leftVC {if (_leftVC == nil) {_leftVC = [TestOneViewController new];}return _leftVC;
}

运行效果如下(找了个网页压缩了下,还给打上了水印):

相对应的右侧弹出的实现方式一样,只是把Frame更改下,就可以实现从右侧弹出的效果。具体代码就不贴了。

如果想回到主页,只用写个移除self.currentVC的方法,调用下就可以了。

- (void)backToMainViewController {[self removeInactiveVC:self.currentVC];}

结束,优化。

到这,大致的实现逻辑都已经讲明了。只是代码有点乱。如果要再项目中使用,第一个ViewController就相当于我们的主页,然后再主页里写这些逻辑就会把主页弄的很臃肿。所以我们其实可可以相UITabbarController一样,写一个控制器,然后传入需要的UIViewController数组,就可以实现。这样使用起来也方便,维护也简单。具体封装就不赘述(我也封装的不太好),最终成型的代码,有兴趣的可以看下。有不妥之处请指出。

Container ViewController自定义转场控制器。相关推荐

  1. iOS 自定义转场动画初探

    最近项目刚迭代,正好闲下来捣鼓了一下iOS的自定义转场的效果.闲话不多说,直接开始上代码吧.(ps:请忽略实际的转场效果,关注技术本身呢哦.pps:主要是转场的动画做的比较low啦!) 1.首先定义一 ...

  2. iOS自定义转场动画实战讲解

    转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerAnimated:completio ...

  3. 【Swift学习笔记-《PRODUCT》读书记录-实现自定义转场动画】

    iOS默认的push动画是把即将展示的控制器从右边推过来.有时我们想实现类似PPT中的一些动画,这时候就需要自定义转场动画了.如下图我们想实现一个淡出并且放大的过场动画,在退出时是一个淡出缩小的动画. ...

  4. 3d翻转 ios_iOS自定义转场详解04——实现3D翻转效果

    这是自定义转场系列的第四篇.由于具有一定的连续性,我会忽略一些基础,所以如果你是第一次看这个系列,可以先过目之前的几篇 --- UIViewControllerTransitioning的用法 .实现 ...

  5. iOS 自定义转场动画浅谈

    代码地址如下: http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差 ...

  6. iOS 自定义转场动画篇

    前言: 自定义转场动画其实并不难, 关键在于能够明白思路, 也就是操作步骤. 本篇博客主要以present转场动画为例, 进行分析, 操作, 如有错误欢迎简信与我交流. 不进行修改的话, presen ...

  7. iOS 关于自定义转场动画,以UITabBarController为例

    1.小记 关于自定义转场动画,只要你理清他的"套路",你就可以随心所欲地自定义了. 大体思路就是:遵守对应的代理协议,然后设置对应的代理,实现代理方法,这个代理方法要返回的值就是你 ...

  8. iOS开发 tabbar自定义转场动画

    1.小记 关于自定义转场动画,只要你理清他的"套路",你就可以随心所欲地自定义了. 大体思路就是:遵守对应的代理协议,然后设置对应的代理,实现代理方法,这个代理方法要返回的值就是你 ...

  9. Swift——自定义转场动画(一)

    弹窗转场/过度动画(Popover效果) 避免浪费大家时间,快速查看运行效果可以直接拉到最后看 [五.完整代码] 部分,如果要看递推逻辑,可以从前往后看. 一.基本设置 弹出一个控制器:系统提供了以下 ...

最新文章

  1. WSRP调用中的一些问题
  2. react中高阶组件
  3. java数据结构之枚举
  4. python web前端开发面试_面试前端,听听别人怎么说!
  5. oracle 索引回表,oracle 索引简单总结
  6. undertow 怎么创建线程_为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow
  7. Delphi 7皮肤控件VCLSkin 5 60的使用
  8. 小tip: base64:URL背景图片与web页面性能优化(转载)
  9. 圆形缓冲区(循环buffer)实现
  10. PostgreSQL最终获得存储过程
  11. Sql Server2008中自定义函数调用存储过程解决方案
  12. mvc jquery ajax分页实例,jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解,mvcpagerajax分页...
  13. 完美世界国际版不用外挂多开的方法
  14. 两种excel 去掉公式保留数值的方法
  15. Unable to find script library '/aspnet_client/system-web/1-1-4322/webvalidation.js'
  16. cmd看excel有多少个子表_excel表格拆分成多个表格方法工具
  17. 09组团队项目-Alpha冲刺-2/6
  18. Android虚拟键盘的高度计算
  19. vim中处理重定向文件中的^H和^M
  20. 【Git版本控制】——保姆级教程

热门文章

  1. Large Memory Footprints on AIX
  2. ivar layout 相关知识点
  3. 386bsd 0.0
  4. ubuntu 16.04 LTS 开发环境的安装及常用软件
  5. 优秀博客 --敏感词汇过滤
  6. Python文件练习
  7. 用DevExpress做界面开发:ASP.NET界面开发框架
  8. java 的单态模式(只可以创建一个对象)
  9. PropertyGrid中的枚举显示为中文(转)
  10. spring-jar包详解整理