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];}