源码下载地址:http://download.csdn.net/detail/liu537192/8551323
效果图:
核心代码:
//
// JLViewController.m
// 08-侧滑菜单
//
// Created by XinYou on 15-3-31.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import "JLViewController.h"
@interface JLViewController ()
/**
* 主界面
*/
@property (weak, nonatomic) IBOutlet UIView *mainView;
/**
* 左边菜单
*/
@property (weak, nonatomic) IBOutlet UIView *leftView;
/**
* 右边菜单
*/
@property (weak, nonatomic) IBOutlet UIView *rightView;
@end
@implementation JLViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 创建手势识别器
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];
// 将手势识别器添加到对应的view上
[self.mainView addGestureRecognizer:pan];
}
- (void)panView:(UIPanGestureRecognizer *)recognizer{
// 手势开始
if (recognizer.state == UIGestureRecognizerStateBegan) {
}
// 手势进行中
else if (recognizer.state == UIGestureRecognizerStateChanged){
// 当前点与前一个点的x方向和y方向改变的值。
CGPoint point = [recognizer translationInView:recognizer.view];
// 改变主界面的frame使之产生滑动效果。
CGRect tempRect = recognizer.view.frame;
tempRect.origin.x += point.x;
// tempRect.origin.y += point.y;// y方向无需改变。
recognizer.view.frame = tempRect;
// 向右滑动时,最大滑动距离不能超过左边菜单的宽度
if (recognizer.view.frame.origin.x >= self.leftView.frame.size.width) {
CGRect myFrame = recognizer.view.frame;
myFrame.origin.x = self.leftView.frame.size.width;
recognizer.view.frame = myFrame;
}
// 向左滑动时,最大滑动距离不能超过右边菜单的宽度
else if (recognizer.view.frame.origin.x <= -self.rightView.frame.size.width) {
CGRect myFrame = recognizer.view.frame;
myFrame.origin.x = -self.rightView.frame.size.width;
recognizer.view.frame = myFrame;
}
// 清空移动的距离。非常重要!如果不清空,移动距离会累加。
[recognizer setTranslation:CGPointZero inView:recognizer.view];
}
// 手势结束
else if (recognizer.state == UIGestureRecognizerStateEnded){
// 手势结束后,主界面左上角顶点的x值
CGFloat mainViewX = recognizer.view.frame.origin.x;
// 向右滑动的距离 < 左边菜单宽度的一半,主界面回到原来位置
if (mainViewX >0 && mainViewX < (self.leftView.frame.size.width * 0.5)) {
[UIView animateWithDuration:0.5 animations:^{
CGRect myFrame = recognizer.view.frame;
myFrame.origin.x = 0;
recognizer.view.frame = myFrame;
}];
}
// 向左滑动的距离 < 右边菜单宽度的一半,主界面回到原来位置
else if (mainViewX < 0 && mainViewX > -(self.rightView.frame.size.width * 0.5)) {
[UIView animateWithDuration:0.5 animations:^{
CGRect myFrame = recognizer.view.frame;
myFrame.origin.x = 0;
recognizer.view.frame = myFrame;
}];
}
// 向右滑动的距离 > 左边菜单宽度的一半,显示左边菜单
else if (mainViewX >= (self.leftView.frame.size.width * 0.5)) {
[UIView animateWithDuration:0.5 animations:^{
CGRect myFrame = recognizer.view.frame;
myFrame.origin.x = self.leftView.frame.size.width;
recognizer.view.frame = myFrame;
}];
}
// 向左滑动的距离 > 右边菜单宽度的一半,显示右边菜单
else if (mainViewX <= -(self.rightView.frame.size.width * 0.5) ) {
[UIView animateWithDuration:0.5 animations:^{
CGRect myFrame = recognizer.view.frame;
myFrame.origin.x = -(self.rightView.frame.size.width);
recognizer.view.frame = myFrame;
}];
}
}
}
@end