使用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实现左右抽屉视图的更多相关文章

  1. 第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明

    第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明 设置后台列表页面可以直接修改字段内容 在当前APP里的adminx.py文件里的 ...

  2. iOS 11开发教程(十四)iOS11应用代码添加视图

    iOS 11开发教程(十四)iOS11应用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. (1)实例化视图对 ...

  3. Spring Boot2 系列教程 (四) | 集成 Swagger2 构建强大的 RESTful API 文档

    前言 快过年了,不知道你们啥时候放年假,忙不忙.反正我是挺闲的,所以有时间写 blog.今天给你们带来 SpringBoot 集成 Swagger2 的教程. 什么是 Swagger2 Swagger ...

  4. 第三方MMDrawerController的使用 抽屉视图+(SUNSlideSwitchView)进度条手势滑动效果实现

    下载网站:https://github.com/mutualmobile/MMDrawerController 首先,到下载网址下载MMDrawerController,将文件导入工程,里面有: MM ...

  5. 我的django之旅(四)模型,模板和视图

    一.结合模型,视图和模板 1.数据和模板结合 基本工作流程: (1)在views.py文件中导入我们创建的models (2)在视图函数中使用models,进行crud操作. (3)将取得的数据存入t ...

  6. 第一百九十四节,jQuery EasyUI,Droppable(放置)组件

    jQuery EasyUI,Droppable(放置)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Droppable(放置)组件的使用方 ...

  7. Java开发笔记(九十四)文件通道的性能优势

    前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了.尽管字节缓存享有缓存方面的性能优势,但 ...

  8. iOS-MMDrawerController的使用【抽屉视图+(SUNSlideSwitchView)进度条手势滑动】转

    下载网站:https://github.com/mutualmobile/MMDrawerController 首先,到下载网址下载MMDrawerController,将文件导入工程,里面有: MM ...

  9. 测开之路九十四:css之盒子模型

    盒子模型 为了演示方便,把内容放到盒子里面 引用css 演示内容 外边距: 4个方向分开写 简写为一条指令,顺序为上右下左 简写为一条指令,第一个值为上下,第二个值为左右 简写为一条指令,只有一个值时 ...

随机推荐

  1. 在java中String类为什么要设计成final

    在java中String类为什么要设计成final? - 胖胖的回答 - 知乎 https://www.zhihu.com/question/31345592/answer/114126087

  2. JavaScript进阶-this

    1.什么是this? 当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文).这个记录会包 含函数在哪里被调用(调用栈).函数的调用方法.传入的参数等信息.this 就是记录的 其中一个属性 ...

  3. swift 初始化

    知识点总结: 1.结构体 1.1.默认初始化方法:1.空初始化方法:2.成员初始化方法 struct Person{ var name = "tom" var age = } le ...

  4. Microsoft Visual Studio 2017 编译最新版 libuv 1.x

    步骤很简单 1 下载最新版的 libuv(地址:https://github.com/libuv 2 安装Git,Python 2.7 ,cmake(这里使用的是 3.11.0-win64-x64 版 ...

  5. 设计模式之中介者模式(Mediator )

    中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...

  6. asp.net使用session完成: 从哪个页面进入登录页面,登录成功还回到那个页面

    1.在Login.aspx页面Load中加入 if (!IsPostBack && Request.UrlReferrer != null) {      Session[ " ...

  7. 代理delegate

    1>代理的用处是什么? 监听那些不能通过addTarget监听的事件 主要用开负责在两个对象之间,发生某些事件时,传递或发送消息 当我们需要 监听某些事件时,但苹果没有提供相关监听方法(addt ...

  8. CF | Alyona and Mex

    Someone gave Alyona an array containing n positive integers a1, a2, ..., an. In one operation, Alyon ...

  9. Docker常见仓库Redis

    Redis 基本信息 Redis 是开源的内存 Key-Value 数据库实现. 该仓库提供了 Redis 2.6 ~ 2.8.9 各个版本的镜像. 使用方法 默认会在 6379 端口启动数据库. $ ...

  10. 360浏览器不能打开CSDN登陆页面

    碰见个奇葩问题: 使用360浏览器(广大程序员不要鄙视我~ 我有我的理由)不能打开csdn的登陆页面~~你登陆的时候,他就一直在那里打转~~ 但是用ie就可以打开登陆页面.... 怎么回事???难道C ...