Container ViewController自定义转场控制器。
前言
最近接触到新公司的老项目改版。自从来了之后一直在忙另一个项目,也没有看老项目的实现逻辑。
看到设计稿的时候,并不是普通的树形标签导航的样子。大致效果如FaceU的主页:
布局类似,但是功能有点不一样:
- 顶部左侧的按钮点击后会出现个人中心页。
- 顶部中间还有个按钮,点击会出现一个业务页
- 顶部左侧的按钮也会出现业务页。
刚看完之后,感觉这种设计真麻烦。最爱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自定义转场控制器。相关推荐
- iOS 自定义转场动画初探
最近项目刚迭代,正好闲下来捣鼓了一下iOS的自定义转场的效果.闲话不多说,直接开始上代码吧.(ps:请忽略实际的转场效果,关注技术本身呢哦.pps:主要是转场的动画做的比较low啦!) 1.首先定义一 ...
- iOS自定义转场动画实战讲解
转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerAnimated:completio ...
- 【Swift学习笔记-《PRODUCT》读书记录-实现自定义转场动画】
iOS默认的push动画是把即将展示的控制器从右边推过来.有时我们想实现类似PPT中的一些动画,这时候就需要自定义转场动画了.如下图我们想实现一个淡出并且放大的过场动画,在退出时是一个淡出缩小的动画. ...
- 3d翻转 ios_iOS自定义转场详解04——实现3D翻转效果
这是自定义转场系列的第四篇.由于具有一定的连续性,我会忽略一些基础,所以如果你是第一次看这个系列,可以先过目之前的几篇 --- UIViewControllerTransitioning的用法 .实现 ...
- iOS 自定义转场动画浅谈
代码地址如下: http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差 ...
- iOS 自定义转场动画篇
前言: 自定义转场动画其实并不难, 关键在于能够明白思路, 也就是操作步骤. 本篇博客主要以present转场动画为例, 进行分析, 操作, 如有错误欢迎简信与我交流. 不进行修改的话, presen ...
- iOS 关于自定义转场动画,以UITabBarController为例
1.小记 关于自定义转场动画,只要你理清他的"套路",你就可以随心所欲地自定义了. 大体思路就是:遵守对应的代理协议,然后设置对应的代理,实现代理方法,这个代理方法要返回的值就是你 ...
- iOS开发 tabbar自定义转场动画
1.小记 关于自定义转场动画,只要你理清他的"套路",你就可以随心所欲地自定义了. 大体思路就是:遵守对应的代理协议,然后设置对应的代理,实现代理方法,这个代理方法要返回的值就是你 ...
- Swift——自定义转场动画(一)
弹窗转场/过度动画(Popover效果) 避免浪费大家时间,快速查看运行效果可以直接拉到最后看 [五.完整代码] 部分,如果要看递推逻辑,可以从前往后看. 一.基本设置 弹出一个控制器:系统提供了以下 ...
最新文章
- WSRP调用中的一些问题
- react中高阶组件
- java数据结构之枚举
- python web前端开发面试_面试前端,听听别人怎么说!
- oracle 索引回表,oracle 索引简单总结
- undertow 怎么创建线程_为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow
- Delphi 7皮肤控件VCLSkin 5 60的使用
- 小tip: base64:URL背景图片与web页面性能优化(转载)
- 圆形缓冲区(循环buffer)实现
- PostgreSQL最终获得存储过程
- Sql Server2008中自定义函数调用存储过程解决方案
- mvc jquery ajax分页实例,jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解,mvcpagerajax分页...
- 完美世界国际版不用外挂多开的方法
- 两种excel 去掉公式保留数值的方法
- Unable to find script library '/aspnet_client/system-web/1-1-4322/webvalidation.js'
- cmd看excel有多少个子表_excel表格拆分成多个表格方法工具
- 09组团队项目-Alpha冲刺-2/6
- Android虚拟键盘的高度计算
- vim中处理重定向文件中的^H和^M
- 【Git版本控制】——保姆级教程