如何在目标 c 中使用 XIB 在登录视图后创建滑出菜单

Posted

技术标签:

【中文标题】如何在目标 c 中使用 XIB 在登录视图后创建滑出菜单【英文标题】:How to create a Slide Out Menu after login view using XIB in objective c 【发布时间】:2016-11-23 11:10:35 【问题描述】:

我是 ios 新手,在创建滑出菜单时遇到问题。 我搜索并找到了该示例,但所有示例都用于情节提要,并且我在 xib 中找到的示例在 AppDelegate 类中调用。 我需要在xib 中创建一个滑出菜单,登录后应该调用它。 提前致谢!

【问题讨论】:

试试这个教程raywenderlich.com/32054/… 将故事板中的滑出菜单控制器设置为 rootview 并在用户未登录时显示 loginview 控制器 @Vinodh 任何其他易于实现的示例。 github.com/Friend-LGA/LGSideMenuController 并且有很多尝试谷歌“side menu ios objective c” @Muju 你有解决办法吗? 【参考方案1】:

侧边栏菜单的最佳示例是SWRevealViewController。该库易于使用且易于理解。

【讨论】:

确实是最好的,但它在 Storyboard 中,而不是在登录后。 不,先生,您也可以在登录后实现侧边栏。假设你有三个控制器,但你想从第二个控制器开始,所以你可以很容易地做到这一点。首先从一个控制器推送到第二个控制器,然后将 sw 连接到第二个控制器,这样您就可以在第二个视图控制器中获取 sw。【参考方案2】:

这对我很有效...试试你的代码。 _parentView 是您的自定义滑出视图,_rightView (UIButton) 用于关闭这些自定义滑出视图。你只需初始化这两个属性

@property (strong,nonatomic) UIView *parentView;
@property (strong,nonatomic) UIButton *rightView;

    -(void)slideView
    
        if(![_parentView isDescendantOfView:app.navController.view])
        
             [self showMenu];
        
        else
        
            [self hideMenu];
        
    
    -(void)showMenu
    
        int width=[[UIScreen mainScreen]bounds].size.width;
        int height=[[UIScreen mainScreen]bounds].size.height;

        _parentView =[[UIView alloc]initWithFrame:CGRectMake(0-(width-70), 0, width-70, self.navigationController.view.frame.size.height)];
        [_parentView setBackgroundColor:[UIColor lightTextColor]];

        [app.navController.view addSubview:_parentView];

        _rightView=[[UIButton alloc]initWithFrame:CGRectMake(0,80, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-80)];
        _rightView.alpha=0.7;
        [_rightView addTarget:self action:@selector(hideMenu) forControlEvents:UIControlEventTouchUpInside];

        if(_parentView.frame.origin.x <0)
        
            [self performSelector:@selector(showSideMenu) withObject:nil afterDelay:0.2];
        


    
    -(void)showSideMenu

        if(_parentView.frame.origin.x <0)
        
            [UIView animateWithDuration:0.5 animations:^
                [UIView animateWithDuration:0.7 animations:^
                    [self.view addSubview:_rightView];
                    _rightView.backgroundColor=[UIColor blackColor];
                ];

                CGRect frame =  _parentView.frame;
                frame.origin.x =0;
                _parentView.frame = frame;

                CGRect rightFrame=self.view.frame;
                rightFrame.origin.x=_parentView.frame.size.width;
                self.view.frame=rightFrame;

                CGRect fram1=app.navController.navigationBar.frame;
                fram1 .origin.x =_parentView.frame.size.width;
                app.navController.navigationBar.frame =fram1 ;
             completion:^(BOOL finished) 
            ];
        
    

    -(void)hideMenu
    
        if(_parentView.frame.origin.x == 0)
        
            [UIView animateWithDuration:0.3 animations:^
                CGRect frame =  _parentView.frame;
                frame.origin.x=-_parentView.frame.size.width;
                _parentView.frame = frame;

                CGRect fram=self.view.frame;
                fram .origin.x=0;
                self.view.frame =fram ;

                CGRect fram1=app.navController.navigationBar.frame;
                fram1 .origin.x =0;
                app.navController.navigationBar.frame =fram1 ;


             completion:^(BOOL finished) 
                [_rightView removeFromSuperview];
                [_parentView removeFromSuperview];
            ];
        
    

谢谢...!!!

【讨论】:

如何添加表格视图,因为您的父视图是透明的。【参考方案3】:

从普通视图控制器推送到 SW 视图控制器

UIStoryboard*Storyboard=[AppDelegate storyBoardType];
SidebarViewController *sidebarmemu =(SidebarViewController*)[Storyboard instantiateViewControllerWithIdentifier:@"SidebarController"];

tbTBC*tabbarController=(tbTBC*)[Storyboard instantiateViewControllerWithIdentifier:@"tbTBCId"];


SWRevealViewController *revealController;
UINavigationController *frontNavigationController;
UINavigationController *rearNavigationController;
frontNavigationController =[[UINavigationController alloc]initWithRootViewController:tabbarController];
rearNavigationController =[[UINavigationController alloc]initWithRootViewController:sidebarmemu];
revealController = [[SWRevealViewController alloc] initWithRearViewController:rearNavigationController frontViewController:frontNavigationController];
revealController.delegate = self;
self.swcontroller =revealController;
self.view.window.rootViewController =self.swcontroller;

借助此代码,您可以获得标签栏和侧栏

【讨论】:

@DishantRajpat 我不希望使用 Storyboard。

以上是关于如何在目标 c 中使用 XIB 在登录视图后创建滑出菜单的主要内容,如果未能解决你的问题,请参考以下文章

LTR 到 RTL 在目标 c 中使用相同的 xib

使用通过 ViewController 从 XIB 加载的子视图中的对象时出错

如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?

如何初始化添加到目标 c 中的 .xib 的 UITableView?

目标 - C / Xcode。在 UViewController 中加载子类 UIViews xib [关闭]

接收到本地通知数据后如何创建使用目标 c 传递给主视图控制器?