RESideMenu使用与解析
课前准备
IOS中,一个视图可以包含多个视图,也就是说视图之间存在父子关系;同时,视图控制器ViewController之间也是存在父子关系的,也就是说一个视图控制器可以包含多个视图控制器。既然视图之间可以构建父子关系,那么为什么还要构建视图控制器之间的父子关系呢?视图控制器,正如其名,就是帮助我们管理、控制视图的。如果我们把所有的 子view 都交给 父view管理,那么父view肯定会很庞大臃肿,我们可以根据逻辑,把view划分给不同的视图控制器viewContorller管理。在iOS中,我们称父控制器为容器控制器。比如,UITabBarController、UINavigationController就是典型的容器控制器,它们可以包含多个子控制器。
RESideMenu的简单使用(参考官方教程)
我们想实现这样的功能:
点击导航栏左边按钮,当前内容视图能够向右滑出一半,于此同时,屏幕左侧会出现一个菜单视图,效果如下图:
我们可以借助RESideMenu实现这个功能。
首先,我们需要创建两个视图控制器,一个表示当前内容视图控制器,另一个代表左侧的菜单控制器。然后,分别赋值给RESideMenu的contentViewController和leftMenuViewController属性。
- RESideMenu *resideMenu=[[RESideMenu alloc] init];
- resideMenu.contentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentViewController"];
- resideMenu.leftMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"leftMenuViewController"];
然后,我们可以根据 项目需要 设置RESideMenu的其他相关属性,下面列出常用属性:
控制 视差视觉效果的属性以及默认值
- _parallaxEnabled = YES;
- _parallaxMenuMinimumRelativeValue = -15;
- _parallaxMenuMaximumRelativeValue = 15;
- _parallaxContentMinimumRelativeValue = -25;
- _parallaxContentMaximumRelativeValue = 25;
控制 内容控制器的阴影效果
- _contentViewShadowEnabled = NO;
- _contentViewShadowColor = [UIColor blackColor];
- _contentViewShadowOffset = CGSizeZero;
- _contentViewShadowOpacity = 0.4f;
- _contentViewShadowRadius = 8.0f;
控制 内容控制器的 缩放以及偏移
- _contentViewInLandscapeOffsetCenterX = 30.f;
- _contentViewInPortraitOffsetCenterX = 30.f;
- _scaleContentView = YES;
- _contentViewScaleValue = 0.7f;
RESideMenu解析
RESideMenu的实现的基本思路:
需要说明的是viewDidLoad方法主要做的事情:
判断属性contentViewController、leftMenuViewController和rightMenuViewController是否为空,如果不为空,设置它们与RESideMenu容器控制器之间的关系,主要步骤分为四步:
1.设置viewController为RESideMenu容器控制器的子控制器
2.设置viewController的view的frame
3.把viewController的view添加到RESideMenu容器控制器的view的中
4.调用viewController的didMoveToParentViewController:,通知viewController它已经被添加到父控制器中。
RESideMenu具有哪些功能呢?
1.充当一个容器控制器,有一个内容控制器、左菜单控制器以及右菜单控制器
2.创建一个类别 UIViewController+RESideMenu ,这个类别提供了一个属性sideMenuViewController、两个方法presentLeftMenuViewController和presentRightMenuViewController。sideMenuViewController属性 指代 当前控制器属于哪一个RESideMenu容器控制器;presentLeftMenuViewController和presentRightMenuViewController方法用于打开左、右菜单控制器。
3.可以用手指滑动打开左、右菜单控制器,通过添加一个pan手势识别来实现
4. 显示左、右菜单控制器。RESideMenu创建了一个分类UIViewController+RESideMenu,这个分类提供了方法presentLeftMenuViewController和presentRightMenuViewController用于显示左、右菜单控制器。展现左、右菜单控制器的主要工作就是缩放内容视图,然后平移内容视图。