两边侧滑菜单栏

作者: 天堂秀 | 来源:发表于2016-08-26 17:27 被阅读124次

    今天要自定义写一个带有左右两边侧滑菜单栏的视图控制器,要求手势滑动

    思路呢就是

    一,现在storyboard上搭建好界面,比如:UITarbarController UINavigationController  UIViewController

    二, 新建左右两个侧滑控制器

    .h

    #import

    @interfaceLeftSideVC :UITableViewController

    @property(nonatomic,copy)void(^exitLeftSideblock)();

    @end

    .m

    #import"LeftSideVC.h"

    @implementationLeftSideVC

    - (void)viewDidLoad{

    [superviewDidLoad];

    [self.tableViewregisterClass:[UITableViewCellclass]forCellReuseIdentifier:@"sideCell"];

    }

    - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{

    return20;

    }

    - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{

    UITableViewCell* cell = [tableViewdequeueReusableCellWithIdentifier:@"sideCell"forIndexPath:indexPath];

    cell.backgroundColor= [UIColororangeColor];

    cell.textLabel.text= [NSStringstringWithFormat:@"我是第%ld行",indexPath.row];

    returncell;

    }

    - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{

    NSLog(@"被点击了第%ld行",indexPath.row);

    if(self.exitLeftSideblock)self.exitLeftSideblock();

    }

    @end

    三,在主控制器上继承自UISideViewController

    .h

    #import"WJSideViewController.h"

    @interfaceOneViewController :WJSideViewController

    @end

    .m

    #import"OneViewController.h"

    #import"LeftSideVC.h"

    #import"RightSideVc.h"

    @interfaceOneViewController()

    @end

    @implementationOneViewController

    - (void)viewDidLoad {

    [superviewDidLoad];

    self.navigationItem.rightBarButtonItem= [[UIBarButtonItemalloc]initWithTitle:@"向左侧滑"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(leftSide)];

    //创建侧滑出来的控制器

    RightSideVC* vc = [[RightSideVCalloc]init];

    //设置侧滑出来的View的宽度,小于屏幕宽度

    vc.view.frame=CGRectMake(0,0,150,0);

    //设置左侧的控制器

    [selfsetRightSideVC:vc];

    //侧滑控制器-退出侧滑状态的代码块

    __weaktypeof(self) weakSelf =self;

    vc.exitRightSideblock= ^{

    [weakSelfleftSide];

    };

    //设置向右侧滑

    self.navigationItem.leftBarButtonItem= [[UIBarButtonItemalloc]initWithTitle:@"向右侧滑"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(rightSide)];

    LeftSideVC* vc1 = [[LeftSideVCalloc]init];

    vc1.view.frame=CGRectMake(0,0,250,0);

    //设置左侧的控制器

    [selfsetLeftSideVC:vc1];

    vc1.exitLeftSideblock= ^{

    [weakSelfrightSide];

    };

    }

    -(void)leftSide{

    [selfsideAnimateDuration:0.25SideDirection:WJSideDirectionLeft];

    }

    -(void)rightSide{

    [selfsideAnimateDuration:0.25SideDirection:WJSideDirectionRight];

    }

    @end

    四,在sideViewController里面实现侧滑功能

    .h

    #import

    typedefenum{

    WJSideDirectionRight,

    WJSideDirectionLeft,

    }WJSideDirection;

    @interfaceWJSideViewController :UIViewController

    /**侧滑并设置侧滑动画时间*/

    -(void)sideAnimateDuration:(NSTimeInterval)duration SideDirection:(WJSideDirection)sideDirectionType;

    /**设置左侧的控制器*/

    -(void)setLeftSideVC:(UIViewController*)leftSideVC;

    /**设置右侧的控制器*/

    -(void)setRightSideVC:(UIViewController*)rightSideVC;

    @end

    .m 

    #import"WJSideViewController.h"

    staticCGFloatconstkSideDistanceRatio =0.55;//滑出0.55倍View的宽度时,松开手指,会自动滑出

    @interfaceWJSideViewController()

    @property(nonatomic,strong)UIView* leftSideView;//左侧滑出的View

    @property(nonatomic,strong)UIView* rightSideView;//右侧划出的View

    @property(nonatomic,strong)UIViewController* leftSideVC;//左侧的控制器

    @property(nonatomic,strong)UIViewController* rightSideVC;//右侧的控制器

    @property(assign,nonatomic)WJSideDirectionsideDirectionType;//侧滑的方向

    @property(assign,nonatomic)BOOLisSide;//滑出状态

    @end

    @implementationWJSideViewController

    #pragma mark -生命周期方法

    - (void)viewDidLoad{

    [superviewDidLoad];

    [self.viewaddGestureRecognizer:[[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(wj_panGesture:)]];

    UITapGestureRecognizer* tap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(wj_tapGesture:)];

    [self.viewaddGestureRecognizer:tap];

    tap.delegate=self;

    }

    - (void)viewDidDisappear:(BOOL)animated{

    [superviewDidDisappear:animated];

    [selfhiddenSideView];

    }

    - (void)hiddenSideView{

    if(self.leftSideVC) {

    self.leftSideView.hidden=YES;

    }

    if(self.rightSideVC) {

    self.rightSideView.hidden=YES;

    }

    }

    #pragma mark -内部方法

    - (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer{

    if([gestureRecognizerisKindOfClass:[UIPanGestureRecognizerclass]]) {

    returnYES;

    }

    returnYES;

    }

    - (UIView*)leftSideView{

    returnself.leftSideVC.view;

    }

    - (UIView*)rightSideView{

    returnself.rightSideVC.view;

    }

    - (void)wj_tapGesture:(UITapGestureRecognizer*)tap{

    if(self.isSide) {

    [selfsideAnimateDuration:0.25SideDirection:_sideDirectionType];

    self.isSide=NO;

    }

    }

    - (void)wj_panGesture:(UIPanGestureRecognizer*)pan{

    CGPointtranslation = [pantranslationInView:pan.view];

    if(pan.state==UIGestureRecognizerStateChanged) {

    CGPointpoint = [self.viewconvertPoint:self.view.frame.origintoView:[UIApplicationsharedApplication].keyWindow];

    if(!self.isSide) {

    if(self.leftSideVC&& point.x>=0&& translation.x=0){

    _sideDirectionType=WJSideDirectionLeft;

    self.leftSideView.hidden=NO;

    [selfsideDistance:translation.x];

    }elseif(self.rightSideVC&& point.x<=0&&- translation.x

    _sideDirectionType=WJSideDirectionRight;

    self.rightSideView.hidden=NO;

    [selfsideDistance:translation.x];

    }

    }else{

    if(self.leftSideVC&& point.x>=0&& translation.x<=0){

    _sideDirectionType=WJSideDirectionLeft;

    [selfsideDistance:(self.leftSideView.bounds.size.width+ translation.x)];

    }elseif(self.rightSideVC&& point.x<=0&&translation.x>=0){

    _sideDirectionType=WJSideDirectionRight;

    self.rightSideView.hidden=NO;

    [selfsideDistance:(-self.rightSideView.bounds.size.width+ translation.x)];

    }

    }

    }elseif(pan.state==UIGestureRecognizerStateEnded) {

    CGPointpoint = [self.viewconvertPoint:self.view.frame.origintoView:[UIApplicationsharedApplication].keyWindow];

    if(_sideDirectionType!=WJSideDirectionRight) {

    if(point.x>=0&& point.x>=self.leftSideView.bounds.size.width*kSideDistanceRatio){

    [selfsideDistance:self.leftSideView.bounds.size.width];

    [UIApplicationsharedApplication].statusBarStyle=UIStatusBarStyleLightContent;

    self.isSide=YES;

    }else{

    [UIViewanimateWithDuration:0.25animations:^{

    [selfsideDistance:0];

    }];

    [UIApplicationsharedApplication].statusBarStyle=UIStatusBarStyleDefault;

    self.isSide=NO;

    }

    }else{

    if( point.x<=0&& -point.x>=self.rightSideView.bounds.size.width*kSideDistanceRatio){

    [selfsideDistance:-self.rightSideView.bounds.size.width];

    [UIApplicationsharedApplication].statusBarStyle=UIStatusBarStyleLightContent;

    self.isSide=YES;

    }else{

    [UIViewanimateWithDuration:0.25animations:^{

    [selfsideDistance:0];

    }];

    [UIApplicationsharedApplication].statusBarStyle=UIStatusBarStyleDefault;

    self.isSide=NO;

    }

    }

    }

    }

    - (void)sideDistance:(CGFloat)distance{

    for(UIView* viewin[UIApplicationsharedApplication].keyWindow.subviews) {

    view.transform=CGAffineTransformMakeTranslation(distance,0);

    }

    }

    #pragma mark -对外接口

    - (void)sideAnimateDuration:(NSTimeInterval)duration SideDirection:(WJSideDirection)sideDirectionType{

    if([UIApplicationsharedApplication].statusBarStyle==UIStatusBarStyleDefault){

    [UIApplicationsharedApplication].statusBarStyle=UIStatusBarStyleLightContent;

    }else{

    [UIApplicationsharedApplication].statusBarStyle=UIStatusBarStyleDefault;

    }

    if(self.isSide) {

    self.isSide=NO;

    [UIViewanimateWithDuration:durationanimations:^{

    for(UIView* viewin[UIApplicationsharedApplication].keyWindow.subviews) {

    view.transform=CGAffineTransformIdentity;

    }

    }completion:^(BOOLfinished) {

    [selfhiddenSideView];

    }];

    return;

    }

    self.isSide=YES;

    if(sideDirectionType ==WJSideDirectionLeft){

    self.rightSideView.hidden=NO;

    }else{

    self.leftSideView.hidden=NO;

    }

    CGFloat_sideWidth = (sideDirectionType ==WJSideDirectionRight) ?self.leftSideView.frame.size.width: -self.rightSideView.frame.size.width;

    [UIViewanimateWithDuration:durationanimations:^{

    [selfsideDistance:_sideWidth];

    }];

    }

    - (void)setLeftSideVC:(UIViewController*)leftSideVC{

    _leftSideVC= leftSideVC;

    [[UIApplicationsharedApplication].keyWindowaddSubview:self.leftSideView];

    CGRectrect =self.leftSideView.bounds;

    CGFloatsideWidth =self.leftSideView.bounds.size.width;

    sideWidth = rect.size.width;

    self.leftSideView.frame=CGRectMake(- rect.size.width,0, rect.size.width, [UIScreenmainScreen].bounds.size.height);

    }

    - (void)setRightSideVC:(UIViewController*)rightSideVC{

    _rightSideVC= rightSideVC;

    [[UIApplicationsharedApplication].keyWindowaddSubview:self.rightSideView];

    CGRectrect =self.rightSideView.bounds;

    CGFloatsideWidth =self.rightSideView.bounds.size.width;

    sideWidth = rect.size.width;

    self.rightSideView.frame=CGRectMake([UIScreenmainScreen].bounds.size.width,0, rect.size.width, [UIScreenmainScreen].bounds.size.height);

    }

    最后的运行效果图:

    最后,群里面很多iOS开发志同道合的伙伴,感兴趣的朋友欢迎加入进来,QQ:580284575

    相关文章

      网友评论

      • pleasures:你好 这个有demo吗?
        天堂秀:群里放了demo,一会上传到github,你去借鉴使用

      本文标题:两边侧滑菜单栏

      本文链接:https://www.haomeiwen.com/subject/mejzsttx.html