使用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. c语言第四次作业

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

  2. Filter,FilterChain,FilterConfig

    实例: package com.zillion.app.filter; import java.io.IOException; import javax.servlet.Filter; import ...

  3. Lintcode394 Coins in a Line solution 题解

    [题目描述] There are n coins in a line. Two players take turns to take one or two coins from right side ...

  4. bootstrap table 和 x-editable 使用方法

    最近需要做一些数据表格,有同事推荐EasyUI,但经过比较还是选择了Bootstrap,一款极为强大的表格组件,基于Bootstrap 的 jQuery .本文还将介绍Bootstrap-editab ...

  5. VueJs(4)---V-model指令

    V-model指令 摘要   限制: v-model只能用在:<input>    <select>    <textarea>  <components&g ...

  6. ubuntu查看IO

    在命令行直接 cp 一个比较大的文件时,由于没有提示信息,总感觉很不放心,可以通过查看IO的方式确认cp操作的进展程度. 查看IO可以使用iostat命令,但是前提是要安装sysstat sudo a ...

  7. Bootstrap3 排版-缩略语

    当鼠标悬停在缩写和缩写词上时就会显示完整内容,Bootstrap 实现了对 HTML 的 <abbr> 元素的增强样式.缩略语元素带有 title 属性,外观表现为带有较浅的虚线框,鼠标移 ...

  8. Android系统对话框——自定义关闭

    Android系统对话框--自定义关闭 Dialog是我们在项目中经常用到的,5.x以后的Dialog也很好看,很安卓风,Android也给我们提供了新的包,低版本可以显示一样的效果.我们在使用的导入 ...

  9. Objective-C特有类型——id

    Objective-C特有类型--id OC里,id和int.double等一样,是一个类型 不同的是: id是一个万能指针,能指向/操作任何OC对象 相当于 (NSObject *) 用法 id i ...

  10. android MultiDex multidex原理原理下遇见的N个深坑(二)

    android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multi ...