iOS中仿QQ侧滑菜单功能
程序员文章站
2023-12-18 21:12:46
uitabbarcontroller做qq侧滑菜单效果:
首先要了解uitabbarcontroller的层级结构:
uitabbarcontroller加载的其它...
uitabbarcontroller做qq侧滑菜单效果:
首先要了解uitabbarcontroller的层级结构:
uitabbarcontroller加载的其它uiviewcontroller的view都是被添加在uitransitionview上(这是一个私有api),uitransitionview在self.view的0层,uitabbar在的第一层。
所以我的思路是这样的:
uitransitionview与uitabbar转移到一个新的view1上去,作为滑动的部分;
在view1与self.view之间再添加一个view2,作为菜单的容器;
给view1添加相应的手势响应;
代码:
#import <uikit/uikit.h> @protocol slidetab_vc_tcvdelegate <nsobject> @optional -(void)didopenmenu:(uiview*)menu; -(void)didclosemenu:(uiview*)menu; @end @interface slidetab_vc : uitabbarcontroller @property(strong, nonatomic)uiview *mmenuv; @property(weak, nonatomic)id <slidetab_vc_tcvdelegate> mdelegate; -(void)openmenu; -(void)closemenu; @end #import "slidetab_vc.h" #define device_w [uiscreen mainscreen].bounds.size.width @interface slidetab_vc ()<uitabbardelegate>{ cgfloat _centermaxx; } @property(strong, nonatomic)uiview *mtransitionview; @property(strong, nonatomic)uitapgesturerecognizer *mtapgester; @property(assign, nonatomic)bool mmenuisopen; @property(strong, nonatomic)uitabbar *mtabbar; @end @implementation slidetab_vc - (void)viewdidload { [super viewdidload]; // do any additional setup after loading the view. self.view.backgroundcolor = [uicolor purplecolor]; _mmenuisopen = no; _centermaxx = device_w*3/2-80.0f; [self initmtransitionview]; [self addgestureformtransitionview]; } #pragma mark 菜单懒加载 -(void)setmmenuv:(uiview *)mmenuv{ if (mmenuv!=nil) { _mmenuv = mmenuv; [self.view insertsubview:_mmenuv atindex:0]; } } #pragma mark 打开菜单 -(void)openmenu{ cgpoint center = self.mtransitionview.center; center.x = _centermaxx; [uiview animatewithduration:0.15f animations:^{ self.mtransitionview.center = center; if (_mdelegate != nil&& [_mdelegate respondstoselector:@selector(didopenmenu:)]) { [_mdelegate didopenmenu:_mmenuv]; } }]; [self mtransitionsubviewsenable:no]; } #pragma mark 关闭菜单 -(void)closemenu{ cgpoint center = self.mtransitionview.center; center.x = device_w/2; [uiview animatewithduration:0.15f animations:^{ self.mtransitionview.center = center; } completion:^(bool finished) { [self mtransitionsubviewsenable:yes]; if (_mdelegate != nil&& [_mdelegate respondstoselector:@selector(didclosemenu:)]) { [_mdelegate didclosemenu:_mmenuv]; } }]; } #pragma mark transition用户交互使能 -(void)mtransitionsubviewsenable:(bool)enable{ for (uiview *tmp in self.mtransitionview.subviews) { tmp.userinteractionenabled = enable; } if (enable) { [self.mtransitionview removegesturerecognizer:_mtapgester]; }else{ [self.mtransitionview addgesturerecognizer:_mtapgester]; } } #pragma mark 配置mtransitionview -(void)initmtransitionview{ for (uiview *tmp in self.view.subviews) { [tmp removefromsuperview]; [self.mtransitionview addsubview:tmp]; } [self.view addsubview:self.mtransitionview]; } #pragma mark 拖动手势动作 -(void)panaction:(uipangesturerecognizer*)pan{ cgpoint location = [pan translationinview:pan.view.superview]; cgpoint center = self.mtransitionview.center; if (pan.state==uigesturerecognizerstateended) { if (center.x<_centermaxx*0.5+device_w*0.25){ [self closemenu]; }else{ [self openmenu]; } }else if(pan.state==uigesturerecognizerstatechanged){ if (location.x<0) {//向左滑 center.x = center.x+location.x<=device_w/2? device_w/2 : center.x+location.x; }else{ center.x = center.x+location.x>=_centermaxx? _centermaxx : center.x+location.x; } self.mtransitionview.center = center; [pan settranslation:cgpointmake(0, 0) inview:pan.view.superview]; } } #pragma mark 添加手势 -(void)addgestureformtransitionview{ uipangesturerecognizer *pan = [[uipangesturerecognizer alloc]initwithtarget:self action:@selector(panaction:)]; [_mtransitionview addgesturerecognizer:pan]; _mtapgester = [[uitapgesturerecognizer alloc]initwithtarget:self action:@selector(tapaction)]; } #pragma mark--懒加载 -(uiview *)mtransitionview{ if (_mtransitionview==nil) { _mtransitionview = [[uiview alloc]initwithframe:self.view.bounds]; } return _mtransitionview; } -(void)tapaction{ cgfloat x = _mtransitionview.center.x; if (x>=_centermaxx) { [self closemenu]; } } @end
总结
以上所述是小编给大家介绍的ios中仿qq侧滑菜单功能,希望对大家有所帮助