Android-like Navigation Drawer for iOS? [closed]

左心房为你撑大大i 提交于 2019-12-02 17:11:35

You would need a SlideOverViewController that has a table view with width as much as you want to overlap, set the background color of the view as clear color(to achieve transparency).

in your MainViewController, initialize and add your SlideOverViewController.

    self.slideOverViewController = [[SlideOverViewController alloc] init];
    self.slideOverViewController.view.frame = CGRectMake(-self.myNavigationController.view.frame.size.width, 0, self.myNavigationController.view.frame.size.width, self.view.frame.size.height);
    self.slideOverViewController.delegate = self;

To activate your slideOverMenu use:

    [self.slideOverViewController.view setHidden:NO];

    [self.view addSubview:self.slideOverViewController.view];

    [UIView animateWithDuration:kMenuAnimationDuration animations:^{

    self.slideOverViewController.view.frame = CGRectMake(0, 0, self.slideOverViewController.view.frame.size.width, self.slideOverViewController.view.frame.size.height);

    [UIView animateWithDuration:kMenuAnimationDuration animations:^{


    }completion:^(BOOL finished){

    }];

}completion:^(BOOL finished){
    self.mainMenuDisplay = YES;
}];

To hide the menu use:

        [UIView animateWithDuration:kMenuAnimationDuration animations:^{

        self.slideOverViewController.view.frame = CGRectMake(-self.myNavigationController.view.frame.size.width - 80, 0, self.myNavigationController.view.frame.size.width, self.myNavigationController.view.frame.size.height);

    }completion:^(BOOL finished){

        self.mainMenuDisplay = NO;
        [self.slideOverViewController.view setHidden:YES];
    }];

In you SLideOverViewController,

add gestureRecognizers:

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGestures:)];
[panGesture setMinimumNumberOfTouches:1];
[panGesture setMaximumNumberOfTouches:1];



  - (void) handlePanGestures : (UIPanGestureRecognizer *) sender
{
if (self.view.frame.origin.x > 0) {
    return;
}

[self.view bringSubviewToFront:[(UIPanGestureRecognizer*)sender view]];
CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view];

if ([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
    self.firstX = [[sender view] center].x;
    self.firstY = [[sender view] center].y;
}

translatedPoint = CGPointMake(self.firstX+translatedPoint.x, self.firstY);

if (translatedPoint.x > self.view.frame.size.width/2) {
    self.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    return;
}

[[sender view] setCenter:translatedPoint];

if ([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded || [sender state] == UIGestureRecognizerStateCancelled || [sender state] == UIGestureRecognizerStateFailed) {

    CGFloat velocityX = (0.2*[(UIPanGestureRecognizer*)sender velocityInView:self.view].x);
    CGFloat finalX = translatedPoint.x + velocityX;
    CGFloat finalY = self.firstY;

    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {
        if (finalX < 0) {
            //finalX = 0;
        } else if (finalX > 768) {
            //finalX = 768;
        }

        if (finalY < 0) {
            finalY = 0;
        } else if (finalY > 1024) {
            finalY = 1024;
        }
    } else {
        if (finalX < 0) {
            //finalX = 0;
        } else if (finalX > 1024) {
            //finalX = 768;
        }

        if (finalY < 0) {
            finalY = 0;
        } else if (finalY > 768) {
            finalY = 1024;
        }
    }

    CGFloat animationDuration = (ABS(velocityX)*.0002)+.2;

    [self animateToPoint:finalX yPos:finalY withAnimationDuration:animationDuration];
}
}
}
}

- (void) animateToPoint : (CGFloat) finalX yPos : (CGFloat) finalY withAnimationDuration : (CGFloat) animationDuration {
if (self.view.frame.origin.x < -90) {
    [self handleCloseSlidingMenuViewController];

} else {
    [self handleShowSlidingMenuView : finalX yPos:finalY withAnimationDuration:animationDuration];
}}

- (void) handleShowSlidingMenuView : (CGFloat) finalX
                          yPos : (CGFloat) finalY
         withAnimationDuration : (CGFloat) animationDuration{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidFinish)];
self.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!