抽屉小框架
抽屉的主要原理为有两个view的frame改变从而显示出抽屉效果
我简单的封装了一个抽屉小框架,希望能对大家有写帮助
-WQDrawerController.h
//
// WQDrawerController.h
// WQDrawer
//
// Created by li on 16/11/26.
// Copyright © 2016年 李文强. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface WQDrawerController : UIViewController
//向外界提供接口,便于外界访问
-(void)mainVC:(UIViewController*)mainVC leftVc:(UIViewController*)leftVc;
@end
-WQDrawerController.m
//
// WQDrawerController.m
// WQDrawer
//
// Created by li on 16/11/26.
// Copyright © 2016年 李文强. All rights reserved.
//
#import "WQDrawerController.h"
@interface WQDrawerController ()
@property(strong,nonatomic)UIViewController*mainVc;
@property(strong,nonatomic)UIViewController*leftVc;
@property(strong,nonatomic)UIButton*coverbtn;
@end
@implementation WQDrawerController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor redColor];
[self addGesture];
}
//设置主控制器和左边控制器
-(void)mainVC:(UIViewController *)mainVC leftVc:(UIViewController *)leftVc{
self.leftVc=leftVc;
[self addChildViewController:self.leftVc];
self.leftVc.view.frame=self.view.frame;
[self.view addSubview:self.leftVc.view];
self.mainVc=mainVC;
[self addChildViewController:self.mainVc];
self.mainVc.view.frame=self.view.frame;
[self.view addSubview:self.mainVc.view];
}
//打开抽屉
-(void)openDrawer{
[UIView animateWithDuration:0.25 animations:^{
self.mainVc.view.frame=CGRectMake([UIScreen mainScreen].bounds.size.width*0.75, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
}];
[self addcover];
}
//关闭抽屉
-(void)closeDrawer{
[UIView animateWithDuration:0.25 animations:^{
self.mainVc.view.frame=CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
}];
[self.coverbtn removeFromSuperview];
self.coverbtn=nil;
}
//添加手势
-(void)addGesture{
UIPanGestureRecognizer*pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(GestureEvent:)];
[self.view addGestureRecognizer:pan];
}
//手势的响应事件
-(void)GestureEvent:(UIPanGestureRecognizer*)pan{
if (pan.state==UIGestureRecognizerStateEnded||pan.state==UIGestureRecognizerStateCancelled) {
if (self.mainVc.view.frame.origin.x>=[UIScreen mainScreen].bounds.size.width*0.5) {
[self openDrawer];
}else{
[self closeDrawer];
}
}else if(pan.state==UIGestureRecognizerStateChanged){
CGFloat offset=[pan translationInView:pan.view].x;
if (offset>0) {
self.mainVc.view.frame=CGRectMake(offset, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
}
}
}
//添加遮盖
-(void)addcover{
self.coverbtn=[[UIButton alloc]init];
[self.coverbtn addTarget:self action:@selector(closeDrawer) forControlEvents:UIControlEventTouchDown];
self.coverbtn.frame=self.mainVc.view.bounds;
[self.mainVc.view addSubview:self.coverbtn];
}
@end
注:在iOS中如果两个View为父子控件,那么这两个view所在的controller也必须为父子控制器