侧滑手势移除控制器,pop
继承导航控制器之后
#import "NAVController.h"
@interface NAVController ()
@property (nonatomic,strong)UIPanGestureRecognizer * panRecongizer;
@property (nonatomic, strong) NSMutableArray *images;
@property (nonatomic, strong) UIImageView *lastVcView;
@property (nonatomic, strong) UIView *cover;
@end
@implementation NAVController
- (UIImageView *)lastVcView
{
if (!_lastVcView) {
UIWindow *window = [UIApplication sharedApplication].keyWindow;
UIImageView *lastVcView = [[UIImageView alloc] init];
lastVcView.frame = window.bounds;
self.lastVcView = lastVcView;
}
return _lastVcView;
}
- (UIView *)cover
{
if (!_cover) {
UIWindow *window = [UIApplication sharedApplication].keyWindow;
UIView *cover = [[UIView alloc] init];
cover.backgroundColor = [UIColor blackColor];
cover.frame = window.bounds;
cover.alpha = 0.5;
self.cover = cover;
}
return _cover;
}
- (NSMutableArray *)images
{
if (!_images) {
self.images = [[NSMutableArray alloc] init];
}
return _images;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)panAction:(UIPanGestureRecognizer*)panRecongizer
{
// 如果只有1个子控制器,停止拖拽
if (self.viewControllers.count <= 1) return;
// 在x方向上移动的距离
CGFloat tx = [panRecongizer translationInView:self.view].x;
if (tx < 0) return;
if (panRecongizer.state == UIGestureRecognizerStateEnded || panRecongizer.state == UIGestureRecognizerStateCancelled) {
// 决定pop还是还原
CGFloat x = panRecongizer.view.frame.origin.x;
if (x >= self.view.frame.size.width * 0.5) {
[UIView animateWithDuration:0.25 animations:^{
panRecongizer.view.transform = CGAffineTransformMakeTranslation(self.view.frame.size.width, 0);
} completion:^(BOOL finished) {
[self popViewControllerAnimated:NO];
[self.lastVcView removeFromSuperview];
[self.cover removeFromSuperview];
panRecongizer.view.transform = CGAffineTransformIdentity;
[self.images removeLastObject];
}];
} else {
[UIView animateWithDuration:0.25 animations:^{
panRecongizer.view.transform = CGAffineTransformIdentity;
}];
}
} else {
// 移动view
panRecongizer.view.transform = CGAffineTransformMakeTranslation(tx, 0);
UIWindow *window = [UIApplication sharedApplication].keyWindow;
// 添加截图到最后面
self.lastVcView.image = self.images[self.images.count - 2];
[window insertSubview:self.lastVcView atIndex:0];
[window insertSubview:self.cover aboveSubview:self.lastVcView];
}
}
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[super pushViewController:viewController animated:animated];
UIPanGestureRecognizer *panRecongizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
[viewController.view addGestureRecognizer:panRecongizer];
[self createScreenShot];
}
/**
* 产生截图
*/
- (void)createScreenShot
{
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
[self.images addObject:image];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (self.images.count > 0) return;
[self createScreenShot];
}
@end