(九十四)集成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];
    }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-01 07:40:33

(九十四)集成PKRevealController实现左右抽屉视图的相关文章

第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

第三百九十四节,Django+Xadmin打造上线标准的在线教育平台-Xadmin集成富文本框 首先安装Django Ueditor1.8.143模块 下载地址 https://pypi.python.org/pypi/DjangoUeditor/1.8.143 下载后  python setup.py install  安装 安装好后在settings.py将DjangoUeditor添加到app INSTALLED_APPS = [ 'django.contrib.admin', 'djan

35.鸡兔同笼问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

#include<iostream> using namespace std; int main() { int Ji,Tu; int k=0; for(int i=1;i<=35;i++) { Ji=i; for(int j=1;j<=35;j++) { Tu=j; if((Ji+Tu==35)&&(2*Ji+4*Tu==94)) { cout<<"Ji= "<<Ji<<" Tu= "&l

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

iOS 11开发教程(十四)iOS11应用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. (1)实例化视图对象 每一个视图都是一个特定的类.在Swift中,经常会说,类是一个抽象的概念,而非具体的事物,所以要将类进行实例化.实例化一个视图对象的具体语法如下: let/var 对象名=视图类() 以我们接触的第一个视图View为例,它的实例化对象如下: let newView=UIView() 其中,UIV

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

前言 快过年了,不知道你们啥时候放年假,忙不忙.反正我是挺闲的,所以有时间写 blog.今天给你们带来 SpringBoot 集成 Swagger2 的教程. 什么是 Swagger2 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 为什么使用 Swagger2 ? 相信刚开始不熟悉 web 开发的时候,大家都有手写 Api 文档的时候.而手写 Api 文档主要有以下几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文档更

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

下载网站:https://github.com/mutualmobile/MMDrawerController 首先,到下载网址下载MMDrawerController,将文件导入工程,里面有: MMDrawerController+Subclass.h MMDrawerBarButtonItem.h MMDrawerBarButtonItem.m MMDrawerController.h MMDrawerController.m MMDrawerVisualState.h MMDrawerVi

上班的第四百九十四天

上完明天,试用期就只剩下3周了,日子过得还是挺快的.这5个星期以来,我从一名嵌入式开发工程师转型为服务器开发工程师,跨度有点大,幸好所使用的语言都是C++,不然真不知道怎么办. 这段时间,公司处于一种空闲的状态,这个不是我想要的,我想要的是能够有很多事情做,天天都很忙碌,可以让自己勤快起来.现在这种状态,实在让我有点无法接受.除了整理文档之外,基本上什么事都不用做了.虽然我没有让自己闲下来,先是搞ACE,现在是复习数据库. 对于ACE,我是蛮喜欢的,但是我怕新项目不会用它,那我这段时间学习的基本

第二百九十四节,Redis缓存-Redis安装

redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周

一个屌丝程序猿的人生(九十四)

第二天,由于林萧刚搬家,把握不准上班需要多久,因此林萧起了个大早. 出门不到5分钟,林萧便来到了公交站,这点中介并没有骗他,这个小区一出门便是公交站,而且有好几路车直达公司最近的公交站,交通也算是非常方便了. 经过了一天的上下班,林萧也基本摸清楚了,坐公交车往返公司的时间,应该是20到40分钟的样子,不过20分钟是完全不堵车的情况下才可以,下班的时候差不多是这个时间,早上上班那会儿,肯定是要接近40分钟的样子. 之前在李魁那住的时候,走路加上坐地铁的时间,也差不多就是40分钟的样子,不过虽然整体

SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结

一 开发环境 1.动态web工程 2.部分依赖 java代码: hibernate-release-4.1.0.Final.zip hibernate-validator-4.2.0.Final.jar spring-framework-3.1.1.RELEASE-with-docs.zip proxool-0.9.1.jar log4j 1.2.16 slf4j -1.6.1 mysql-connector-java-5.1.10.jar hamcrest 1.3.0RC2 ehcache 2