实用小技巧(十五):左侧向右滑动返回上一级控制器

版本记录

版本号 时间
V1.0 2017.07.15

前言

在app中,我们经常有需求就是滑动左侧边距向右,就会回到上一级控制器。感兴趣的可以看看我写的其他小技巧。
1. 实用小技巧(一):UIScrollView中上下左右滚动方向的判断

2. 实用小技巧(二):屏幕横竖屏的判断和相关逻辑
3.实用小技巧(三):点击手势屏蔽子视图的响应
4.实用小技巧(四):动态的增删标签视图
5.实用小技巧(五):通过相册或者相机更改图标
6.实用小技巧(六):打印ios里所有字体
7. 实用小技巧(七):UITableViewCell自适应行高的计算
8. 实用小技巧(八):数字余额显示的分隔
9.实用小技巧(九):类头条模糊背景的实现
10.实用小技巧(十):晃动手机换后台服务器网络
11.实用小技巧(十一):scrollView及其子类显示的一些异常处理
12.实用小技巧(十二):头像图片缩放以及保存到相册简单功能的实现
13.实用小技巧(十三):一种类酷我音乐盒动画实现
14.实用小技巧(十四):生成跳往applestore指定app的方法

功能需求

很多时候我们的app为了获得很好的交互体验,那么只要不是跟控制器,就可以向右滑动屏幕,返回上一级控制器。其实自从iOS7以后系统默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能,返回上一级控制器。

首先要让大家看一下代码组织结构。

代码结构

下面看一下代码。

1.AppDelegate.m


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    JJVC1 *vc1 = [[JJVC1 alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc1];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}

2. JJVC1.m
#import "JJVC1.h"
#import "JJVC2.h"

@interface JJVC1 ()

@end

@implementation JJVC1

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.title = @"VC1";
    self.view.backgroundColor = [UIColor magentaColor];
    
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidTapped)];
    [self.view addGestureRecognizer:tapGesture];
}

#pragma mark - Action && Notification

- (void)viewDidTapped
{
    JJVC2 *vc2 = [[JJVC2 alloc] init];
    [self.navigationController pushViewController:vc2 animated:YES];
}

@end
3.JJVC2.m
#import "JJVC2.h"
#import "JJVC3.h"

@interface JJVC2 ()

@end

@implementation JJVC2

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.title = @"VC2";
    self.view.backgroundColor = [UIColor blueColor];

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidTapped)];
    [self.view addGestureRecognizer:tapGesture];
}

#pragma mark - Action && Notification

- (void)viewDidTapped
{
    JJVC3 *vc3 = [[JJVC3 alloc] init];
    [self.navigationController pushViewController:vc3 animated:YES];
}

@end

4. JJVC3.m
#import "JJVC3.h"

@interface JJVC3 ()

@end

@implementation JJVC3

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.title = @"VC3";
    self.view.backgroundColor = [UIColor greenColor];
}

@end

系统此时自带的侧滑效果是管用的,可以返回上一级控制器,具体效果如下所示。

侧滑功能展示

手势失效

有时候我们会发现左滑的手势失效了,具体失效的原因很多,其中有一种手动的方式可以放左边侧滑的返回上一级控制器失效,我们在vc2和vc3中,加入一句代码。

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

就会发现左边侧滑功能失效了。手势可以失效,那我们有时候是别的原因引起的,如果手势失效我们可以这么解决。

self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;

但是这里还有个问题:这行代码确实可以实现滑动返回了,但是在根视图的时候也可以侧滑返回,这样当你再次在根视图触发一些 Action 的时候就不执行了。具体解决方法如下。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (self.navigationController.viewControllers.count > 1) {
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    }
    else{
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    }
}

还可以调用系统的其他方法完成这个功能,可以遵循下面的方法尝试一下。

  • 获取系统自带滑动手势的target对象。
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
  • 创建全屏滑动手势~调用系统自带滑动手势的target的action方法。
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];

  • 设置手势代理~拦截手势触发。
pan.delegate = self;

  • 给导航控制器的view添加全屏滑动手势。
[self.view addGestureRecognizer:pan];
  • 将系统自带的滑动手势禁用。

self.navigationController.interactivePopGestureRecognizer.enabled = NO;
  • 拦截手势触发的方法。
//  return NO;则不需要触发滑动手势
//  return YES;则需要触发滑动手势

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}

下面我们看一下代码。

#import "JJVC2.h"
#import "JJVC3.h"

@interface JJVC2 () <UIGestureRecognizerDelegate>

@end

@implementation JJVC2

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.title = @"VC2";
    self.view.backgroundColor = [UIColor blueColor];

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidTapped)];
    [self.view addGestureRecognizer:tapGesture];
    
    id target = self.navigationController.interactivePopGestureRecognizer.delegate;
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    pan.delegate = self;
    [self.view addGestureRecognizer:pan];
    
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    
}

#pragma mark - Action && Notification

- (void)viewDidTapped
{
    JJVC3 *vc3 = [[JJVC3 alloc] init];
    [self.navigationController pushViewController:vc3 animated:YES];
}

#pragma mark - UIGestureRecognizerDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    //如果有多种手势的话,可以在这里进行自定义设置,我这里就选择均有效了。
    
    return YES;
}

@end

具体效果如下所示。

左侧滑的自定义实现

这里看见我只在从vc2中加的代码,所以可以左滑动返回到vc1,但是没有在vc3中加入这段代码,vc3中系统的返回还被我禁掉了,所以只能点击导航左侧返回按钮返回了。

后记

这些小功能,都很简单,玩玩还挺有意思~~~

镁铝
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容