ios-day17-08(手势识别器之“拖拽”,使用UIPanGestureRecognizer实现侧滑菜单)

源码下载地址: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值