侧面弹出菜单效果

界面内容——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];
    }];
}

 

posted on 2014-09-23 09:36  嘉遁  阅读(150)  评论(0)    收藏  举报

导航