IOS 自定义 滑动返回 手势
/**
只需要在你自定义的导航控制器中,改成如下代码即可,自定义手势返回
*/
#define KEY_WINDOW [[UIApplication sharedApplication] keyWindow]
#define kScreenW KEY_WINDOW.bounds.size.width
#define kAnimateDuration 0.3
#define kDefaultAlapa 0.5
#define kDefaultScale 0.95
#define iOS7 ([UIDevice currentDevice].systemVersion.floatValue >= 7.0)
#import "CXNavigationController.h"
#import <QuartzCore/QuartzCore.h>
@interfaceCXNavigationController ()
{
NSMutableArray *_images; //图片数组
UIView *_bgView; //背景图
UIView *_blankMask; //面罩
UIImageView *_imageView; //图像
CGPoint _startPoint; //开始接触点
}
@end
@implementation CXNavigationController
- (void)viewDidLoad{
[superviewDidLoad];
_images = [NSMutableArrayarray];
if (!iOS7) {
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizeralloc] initWithTarget:selfaction:@selector(panMove:)];
[self.viewaddGestureRecognizer:pan];
}
}
- (void)panMove:(UIPanGestureRecognizer *)pan{
if (self.viewControllers.count <= 1) {
return;
}
CGRect selfF = self.view.frame;
CGPoint location = [pan locationInView:KEY_WINDOW];
if (pan.state == UIGestureRecognizerStateBegan) { //开始拖拽
_startPoint = location;
_imageView.image = [_imageslastObject];
[KEY_WINDOWinsertSubview:_bgViewbelowSubview:self.tabBarController.view];
_imageView.transform = CGAffineTransformMakeScale(kDefaultScale, kDefaultScale);
}elseif(pan.state == UIGestureRecognizerStateChanged){ //拖拽中
CGFloat marginX = location.x - _startPoint.x;
marginX = marginX > kScreenW ? kScreenW : marginX;
marginX = marginX < 0 ? 0 : marginX;
selfF.origin.x = marginX;
self.view.frame = selfF;
CGFloat scale = kDefaultScale + marginX * 1.0 / 6400;
scale = marginX == kScreenW ? 0.5 : scale;
scale = marginX == 0 ? 0 : scale;
_imageView.transform = CGAffineTransformMakeScale(scale, scale);
CGFloat alpha = kDefaultAlapa - (1 - kDefaultAlapa) * marginX * 1.0 / kScreenW;
alpha = marginX == kScreenW ? kDefaultAlapa : alpha;
alpha = marginX == 0 ? 0 : alpha;
_blankMask.alpha = alpha;
}elseif(pan.state == UIGestureRecognizerStateEnded){ //结束
CGFloat marginX = location.x - _startPoint.x;
if (marginX > 50) {
marginX = marginX > kScreenW ? kScreenW : marginX;
CGFloat dur = kAnimateDuration - marginX * 1.0 / 2000;
[UIViewanimateWithDuration:dur animations:^{
CGRect selfF = self.view.frame;
selfF.origin.x = KEY_WINDOW.bounds.size.width;
self.view.frame = selfF;
_blankMask.alpha = 0;
_imageView.transform = CGAffineTransformMakeScale(1, 1);
} completion:^(BOOL finished) {
[_images removeLastObject];
[_bgView removeFromSuperview];
CGRect rect = self.view.frame;
rect.origin.x = 0;
self.view.frame = rect;
[superpopViewControllerAnimated:NO];
}];
}else{
CGFloat marginX = location.x - _startPoint.x;
marginX = marginX > 50 ? 50 : marginX;
marginX = marginX < 0 ? 0 : marginX;
CGFloat dur = marginX * 1.0 / 500;
[UIViewanimateWithDuration:0.1 + dur animations:^{
CGRect selfF = self.view.frame;
selfF.origin.x = 0;
self.view.frame = selfF;
}];
}
}
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.viewControllers.count > 0) {
if (!iOS7) {
[self createBg];
}
}
[super pushViewController:viewController animated:animated];
}
#pragma mark 创建背景
- (void)createBg{
[_imagesaddObject:[selfcurrentScreenImage]];
if (!_bgView) {
_bgView = [[UIView alloc] initWithFrame:KEY_WINDOW.bounds];
_bgView.backgroundColor = [UIColorblackColor];
_imageView = [[UIImageView alloc] initWithFrame:KEY_WINDOW.bounds];
_imageView.backgroundColor = [UIColorclearColor];
[_bgViewaddSubview:_imageView];
_blankMask = [[UIView alloc] initWithFrame:KEY_WINDOW.bounds];
_blankMask.backgroundColor = [UIColorblackColor];
_blankMask.alpha = kDefaultAlapa;
[_bgViewaddSubview:_blankMask];
}
}
#pragma mark 获取当期屏幕
- (UIImage *)currentScreenImage{
UIGraphicsBeginImageContextWithOptions(KEY_WINDOW.bounds.size, self.view.opaque, 0.0);
if (self.topViewController.tabBarController) {
[self.topViewController.tabBarController.view.layerrenderInContext:UIGraphicsGetCurrentContext()];
}else{
[self.view.layerrenderInContext:UIGraphicsGetCurrentContext()];
}
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}