手势仿QQ侧滑---秀清

//
//  SlideViewController.h
//  qqcehua
//
//  Created by 张秀清 on 15/5/25.
//  Copyright (c) 2015年 张秀清. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface SlideViewController : UIViewController
{
    @private
    UIViewController *leftViewControl;
    UIViewController *mainViewControl;
    
    CGFloat scalef;//缩小系数
}


//滑动速度系数-建议在0.5-1之间。默认为0.5
@property (assign,nonatomic) CGFloat speedf;

//是否允许点击视图恢复视图位置。默认为yes
@property (strong) UITapGestureRecognizer *sideslipTapGes;

-(instancetype)initWithLeftViewController:(UIViewController *)leftViewController mainViewController:(UIViewController *)mainViewController;

@end


//
//  SlideViewController.m
//  qqcehua
//
//  Created by 张秀清 on 15/5/25.
//  Copyright (c) 2015年 张秀清. All rights reserved.
//

#import "SlideViewController.h"

@interface SlideViewController ()

@end

@implementation SlideViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

-(instancetype)initWithLeftViewController:(UIViewController *)leftViewController mainViewController:(UIViewController *)mainViewController
{
    if (self = [super init])
    {
        self.speedf = 0.5;

        leftViewControl = leftViewController;
        mainViewControl = mainViewController;
        
        //滑动手势
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
        [mainViewControl.view addGestureRecognizer:pan];
        
        self.sideslipTapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];
        self.sideslipTapGes.numberOfTapsRequired = 1;
        
        [mainViewControl.view addGestureRecognizer:self.sideslipTapGes];
        
        leftViewControl.view.hidden = YES;
        
        [self.view addSubview:leftViewControl.view];
        [self.view addSubview:mainViewControl.view];
    }
    return self;
}

#pragma mark - 滑动手势
-(void)handlePan:(UIPanGestureRecognizer *)panGesture
{
    CGPoint point = [panGesture translationInView:self.view];
    
    scalef = (point.x*self.speedf+scalef);//缩小系数
    
    if (panGesture.view.frame.origin.x >=0)//向右滑
    {
        panGesture.view.center = CGPointMake(panGesture.view.center.x + point.x*self.speedf, panGesture.view.center.y);
        /*
         CGAffineTransformIdentity,每次变换前都要置位,不然你变换用的坐标系统不是屏幕坐标系统(即绝对坐标系统),而是上一次变换后的坐标系统
         */
        panGesture.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1-scalef/1000, 1-scalef/1000);//缩小图片
        [panGesture setTranslation:CGPointMake(0, 0) inView:self.view];//移动以后的坐标
        
        leftViewControl.view.hidden = NO;
    }
    
    if (panGesture.state == UIGestureRecognizerStateEnded)
    {
        if (scalef>100*self.speedf)
        {
            [self showLeftView];
        }
        else
        {
            [self showMainView];
            scalef = 0;
        }
    }
}

#pragma mark - 单击手势
-(void)handleTap:(UITapGestureRecognizer *)tapGesture
{
    if (tapGesture.state == UIGestureRecognizerStateEnded) {
        [UIView beginAnimations:nil context:nil];
        tapGesture.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);
        tapGesture.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2,[UIScreen mainScreen].bounds.size.height/2);
        [UIView commitAnimations];
        scalef = 0;
        
    }
}

#pragma mark - 修改视图位置
//恢复位置
-(void)showMainView{
    [UIView beginAnimations:nil context:nil];
    mainViewControl.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);
    mainViewControl.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2,[UIScreen mainScreen].bounds.size.height/2);
    [UIView commitAnimations];
}

//显示左视图
-(void)showLeftView{
    [UIView beginAnimations:nil context:nil];
    mainViewControl.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.8,0.8);
    mainViewControl.view.center = CGPointMake(340,[UIScreen mainScreen].bounds.size.height/2);
    [UIView commitAnimations];
    
}
@end
原文地址:https://www.cnblogs.com/sixindev/p/4527581.html