版本记录
版本号 | 时间 |
---|---|
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中系统的返回还被我禁掉了,所以只能点击导航左侧返回按钮返回了。
后记
这些小功能,都很简单,玩玩还挺有意思~~~