IOS 自訂 滑動返回 手勢

來源:互聯網
上載者:User

標籤:class   tar   ext   color   com   get   

/**

  只需要在你自訂的導航控制器中,改成如下代碼即可,自訂手勢返回

*/

#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;

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.