侧面弹出菜单效果
界面内容——mainViewController包含的内容
1.menuController,为弹出菜单:[self.view addSubview:self.menuController.view]
2.containerView,在menuController的view的上层,负责存放subController的子view,以及识别手势:[self.view addSubviews:self.containerView]
3.contentController,保存当前的childController,为主要显示内容。
初始化
1.self.view包含两层,下层为self.menuController.view,上层为self.containerView。
[self.view addSubview:self.menuController.view] [self.view addSubviews:self.containerView]
2.设置self.contentController为此mainViewController的childController,并且以self.containerView作为显示childController的view的容器。
[self.contentController = childController1; [self addChildViewController:self.contentController]; [self.contentController didMoveToParentViewController:self]; [self.containerView addSubview:self.contentController.view];
3.添加手势识别
//滑动手势 UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)]; [self.contentController.view addGestureRecognizer:pan]; //单击手势 sideslipTapGes= [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handeTap:)]; [sideslipTapGes setNumberOfTapsRequired:1]; [self.contentController.view addGestureRecognizer:sideslipTapGes];
childController切换
[self addChildViewController:childController2];
[self.contentController willMoveToParentViewController:nil];
            
[self transitionFromViewController:self.contentController toViewController:childController2 duration:0 options:UIViewAnimationOptionCurveEaseIn animations:nil completion:^(BOOL finished) {
                [childController2 didMoveToParentViewController:self];
                [self.contentController removeFromParentViewController];//不用再调用didMoveTo nil
                
                self.currentVC = childController2;
                //[self openWithAnimation:animated];
            }];
滑动containerView
方法1:
CGPoint translation = [recognizer translationInView:recognizer.view]; recognizer.view.center = CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y); [recognizer setTranslation:CGPointZero inView:recognizer.view]; scalef = (translation.x*speedf+scalef); recognizer.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1-scalef/1000,1-scalef/1000);//顺便缩小。CGAffineTransformIdentity从初始大小开始?
方法2:
CGPoint translation = [recognizer translationInView:recognizer.view];
 
switch (recognizer.state) {
        case UIGestureRecognizerStateBegan: 
            [recognizer setTranslation:CGPointMake(recognizer.view.frame.origin.x, 0) inView:recognizer.view];//必须。正向从0移动到x,反相的时候先设置为x
            break;
        case UIGestureRecognizerStateChanged: 
            [recognizer.view setTransform:CGAffineTransformMakeTranslation(MAX(0,translation.x), 0)];
            [self statusBarView].transform = recognizer.view.transform;//statusBar跟着一起移动的方法
            break;
}
滑动结束,显示或者隐藏menuController
-(void)showMainView{
    [UIView beginAnimations:nil context:nil];
    self.contentController.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);
    self.contentController.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2,[UIScreen mainScreen].bounds.size.height/2);
    [UIView commitAnimations];
}
-(void)showLeftView{
    [UIView beginAnimations:nil context:nil];
    self.contentController.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.8,0.8);
    self.contentController.view.center = CGPointMake(340,[UIScreen mainScreen].bounds.size.height/2);
    [UIView commitAnimations];
}
加入弹簧效果
- (void)showMenuAnimated:(BOOL)animated duration:(CGFloat)duration
         initialVelocity:(CGFloat)velocity;
{
    // animate
    __weak typeof(self) blockSelf = self;
    [UIView animateWithDuration:animated ? duration : 0.0 delay:0
         usingSpringWithDamping:JDSideMenuDefaultDamping initialSpringVelocity:velocity options:UIViewAnimationOptionAllowUserInteraction animations:^{
             blockSelf.containerView.transform = CGAffineTransformMakeTranslation(self.menuWidth, 0);
             [self statusBarView].transform = blockSelf.containerView.transform;
         } completion:nil];
}
- (void)hideMenuAnimated:(BOOL)animated;
{
    __weak typeof(self) blockSelf = self;
    [UIView animateWithDuration:JDSideMenuDefaultCloseAnimationTime animations:^{
        blockSelf.containerView.transform = CGAffineTransformIdentity;
        [self statusBarView].transform = blockSelf.containerView.transform;
    } completion:^(BOOL finished) {
        [blockSelf.menuController.view removeFromSuperview];
    }];
}
                    
                
                
            
        
浙公网安备 33010602011771号