(九十四)集成PKRevealController实现左右抽屉视图
使用PKRevealController可以实现类似于QQ等软件的左右抽屉视图,拖出的视图分为leftView和rightView,分别取自View的左半部分和右半部分,因此,根据不同的需求,可以选择使用一个View作为leftView和rightView,也可以指定两个View。
下面介绍这个框架的基本使用步骤。
①从github下载源码:PKRevealController
②导入Source/PKRevealController文件夹到工程。
③为了方便,下面以代码的方式创建窗口的根控制器,利用storyboard创建左右抽屉视图。
1.要利用代码创建根控制器,首先在工程设置中去掉Main Interface中的Main。
2.在AppDelegate中,导入PKRevealController.h,创建根控制器,在这里,默认展示的控制器被称为frontView,左右抽屉分别称为leftView和rightView。
④PKRevealController的类方法revealControllerWithFrontViewController方法有两个,一个是仅创建单个抽屉,一个是两个一起创建,只要传入UIViewController即可,这里演示的是通过leftView.storyboard创建的视图同时作为leftView和rightView。
注意最后根控制器应该是revealController。
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- UIViewController *mainVc = [[UIViewController alloc] init];
- mainVc.view.backgroundColor = [UIColor whiteColor];
- UIStoryboard *sb = [UIStoryboard storyboardWithName:@"leftView" bundle:nil];
- UIViewController *leftVc = sb.instantiateInitialViewController;
- UIViewController *rightVc = leftVc;
- self.revealVc = [PKRevealController revealControllerWithFrontViewController:mainVc leftViewController:leftVc rightViewController:rightVc];
- self.revealVc.delegate = self;
- self.revealVc.animationDuration = 0.25;
- self.window.rootViewController = self.revealVc;
- [self.window makeKeyAndVisible];
- return YES;
- }
需要注意的是,storyboard的instantiateInitialViewController方法每调用一次,就会创建一个新的UIViewController,如果要共用一个,不能调用两次。
⑤设置代理的目的是监听当前的焦点位置,是leftView、frontView还是rightView;设置动画间隔是为了设置抽屉展开和收起的动画速度,快一些效果更好。
一个下图这样布局的storyboard在leftView和rightView上分别展示如下:
⑥实现代理方法可以监听状态的改变:
- - (void)revealController:(PKRevealController *)revealController didChangeToState:(PKRevealControllerState)state{
- switch (state) {
- case PKRevealControllerShowsFrontViewController:
- NSLog(@"展示主窗口%@",revealController.frontViewController);
- break;
- case PKRevealControllerShowsLeftViewController:
- NSLog(@"展示左窗口%@",revealController.leftViewController);
- break;
- case PKRevealControllerShowsRightViewController:
- NSLog(@"展示右窗口%@",revealController.rightViewController);
- break;
- default:
- break;
- }
- }
⑦通过下面两个方法实现抽屉加长、回缩。
- /**
- 让抽屉进入展示模式,也就是加长一段
- @param animated 是否有动画效果
- @param completion 执行完毕后的回调
- */
- - (void)enterPresentationModeAnimated:(BOOL)animated
- completion:(PKDefaultCompletionHandler)completion;
- /**
- 如果在展示模式下,则回到正常的抽屉或者退出展示。
- @param entirely 如果传YES,会将整个抽屉退出,传NO则只退出展示模式
- @param animated 是否有动画效果
- @param completion 执行完毕后的回调
- */
- - (void)resignPresentationModeEntirely:(BOOL)entirely
- animated:(BOOL)animated
- completion:(PKDefaultCompletionHandler)completion;
要判断当前所属模式,使用下面的成员属性:
- @property (nonatomic, readonly) BOOL isPresentationModeActive;
下面的代码通过给leftView和rightView重写触摸事件,通过拿到revealViewController来更改抽屉模式。
注意应该在AppDelegate中将revealController暴露出来才能获取到。
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
- AppDelegate *delegate = [UIApplication sharedApplication].delegate;
- PKRevealController *revealVc = [delegate sharedRevealVc];
- if([revealVc isPresentationModeActive]){
- [revealVc resignPresentationModeEntirely:NO animated:YES completion:nil];
- }else{
- [revealVc enterPresentationModeAnimated:YES completion:nil];
- }
- }
(九十四)集成PKRevealController实现左右抽屉视图的更多相关文章
- 第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明
第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明 设置后台列表页面可以直接修改字段内容 在当前APP里的adminx.py文件里的 ...
- iOS 11开发教程(十四)iOS11应用代码添加视图
iOS 11开发教程(十四)iOS11应用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. (1)实例化视图对 ...
- Spring Boot2 系列教程 (四) | 集成 Swagger2 构建强大的 RESTful API 文档
前言 快过年了,不知道你们啥时候放年假,忙不忙.反正我是挺闲的,所以有时间写 blog.今天给你们带来 SpringBoot 集成 Swagger2 的教程. 什么是 Swagger2 Swagger ...
- 第三方MMDrawerController的使用 抽屉视图+(SUNSlideSwitchView)进度条手势滑动效果实现
下载网站:https://github.com/mutualmobile/MMDrawerController 首先,到下载网址下载MMDrawerController,将文件导入工程,里面有: MM ...
- 我的django之旅(四)模型,模板和视图
一.结合模型,视图和模板 1.数据和模板结合 基本工作流程: (1)在views.py文件中导入我们创建的models (2)在视图函数中使用models,进行crud操作. (3)将取得的数据存入t ...
- 第一百九十四节,jQuery EasyUI,Droppable(放置)组件
jQuery EasyUI,Droppable(放置)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Droppable(放置)组件的使用方 ...
- Java开发笔记(九十四)文件通道的性能优势
前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了.尽管字节缓存享有缓存方面的性能优势,但 ...
- iOS-MMDrawerController的使用【抽屉视图+(SUNSlideSwitchView)进度条手势滑动】转
下载网站:https://github.com/mutualmobile/MMDrawerController 首先,到下载网址下载MMDrawerController,将文件导入工程,里面有: MM ...
- 测开之路九十四:css之盒子模型
盒子模型 为了演示方便,把内容放到盒子里面 引用css 演示内容 外边距: 4个方向分开写 简写为一条指令,顺序为上右下左 简写为一条指令,第一个值为上下,第二个值为左右 简写为一条指令,只有一个值时 ...
随机推荐
- python2.7入门---内置函数
内置函数 abs() divmod() input() open() staticmethod() all() enumerate() int() ord() str() any() ...
- 11.QT-布局管理器(Box,Grid,Form,Stacked)
布局管理器简介 QT中提供了对界面组件进行布局管理的类,用于对界面组件进行管理, 能够自动排列窗口中的界面组件 窗口大小变化后,便会自动更新界面组件的大小. 布局管理器可以自定义,从而达到更加个性化界 ...
- Linux中Mysql root用户看不到mysql库问题解决方式
第一种方式: 1.首先停止MySQL服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables & ...
- OLE:对象的类没有在注册数据库中注册
我在网上下载了破解版的SAS9.3,用了一段时间之后,今天打开就填出一个提示框:OLE:对象的类没有在注册数据库中注册 激活该对象所需的应用程序不可用.是否用"转换--"将其转换为 ...
- 【python标准库模块二】random模块学习
random模块是用来生成随机数的模块 导入random模块 import random 生成一个0~1的随机数,浮点数 #随机生成一个0~1的随机数 print(random.random()) 生 ...
- Mac下安装PEAR
The following instructions install PEAR and PECL on Mac OS X under/usr/local/. PECL is bundled with ...
- [self init]
在字典转模型中遇到了这样的代码: #import "HMAppInfo.h" @implementation HMAppInfo - (instancetype)initWithD ...
- ACM 人见人爱A^B
求A^B的最后三位数表示的整数. 说明:A^B的含义是"A的B次方" Input输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10 ...
- Linux 虚存的性能问题
虚存子系统是所有 UNIX 系统的核心组件.下面讨论虚存系统的实现及其对操作系统中几乎其他所有子系统的作用和影响.首先详细说明一些基本的内存管理问题:然后具体分析 Linux 操作系统如何实施虚存管理 ...
- Swift3中dispatch_once废弃的解决办法
在Swift中如果想搞类的单例模式,那么在初始化的时候一般会使用just one time执行的方式,我们使用dispatch_once_t配合调用dispatch_once方法,一般的代码如下: s ...