美文网首页
iOS侧滑返回实现

iOS侧滑返回实现

作者: 晓飞90 | 来源:发表于2017-07-14 15:26 被阅读976次

1. 使用官方API解决Navigation侧滑导致的Navigationbar异常显示和隐藏的问题

参考:http://blog.csdn.net/u012399891/article/details/50502035

问题一

登陆页面隐藏了navigationbar,注册和关于页面显示了navigationbar,在侧滑时如果从注册页面侧滑一半(不要松开手)让登陆页面显示然后再往左滑把登陆页面收起,此时点击关于页时头上的navigationbar就成了注册页的navigationbar。效果如下(附带正常效果):

问题二(原来的一个项目的效果就是问题二)

注册页侧滑回登陆页的过程中,注册页的navigationbar被隐藏了,而我们想要的效果是正常效果动画中的样子。

异常效果:


异常效果.gif

正常效果:


正常效果.gif

解决方法用forKingdog的开源框架中的一个分类就可以解决了:名称是UINavigationController+FDFullscreenPopGesture
(一个很不错的开源项目附地址:https://github.com/forkingdog)这个分类,然后在需要隐藏navigation bar的页面设置属性 self.fd_prefersNavigationBarHidden = YES;问题即可解决!

分类的分析:

现在给大家分享下成果,源码不多,一个.m文件也就200多行,代码,没有写特意写专场动画,使用系统的interactivePopGestureRecognizer.delegate也就是系统的转场动画来实现效果。那么说,系统就应该为我们实现好了我们想要的效果才对,于是乎继续查看搜索fd_prefersNavigationBarHidden到底是在什么地方调用,为何用了它切换时的动画效果就解决了。于是在下面的代码中找到了答案

- (void)fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:(UIViewController *)appearingViewController
{
    if (!self.fd_viewControllerBasedNavigationBarAppearanceEnabled) {
        return;
    }
    __weak typeof(self) weakSelf = self;
    _FDViewControllerWillAppearInjectBlock block = ^(UIViewController *viewController, BOOL animated) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        if (strongSelf) {
            [strongSelf setNavigationBarHidden:viewController.fd_prefersNavigationBarHidden animated:animated];
        }
    };

    appearingViewController.fd_willAppearInjectBlock = block;
    UIViewController *disappearingViewController = self.viewControllers.lastObject;
    if (disappearingViewController && !disappearingViewController.fd_willAppearInjectBlock) {
        disappearingViewController.fd_willAppearInjectBlock = block;
    }
}

重点:

[strongSelf setNavigationBarHidden:viewController.fd_prefersNavigationBarHiddenanimated:animated];

就是解决问题的关键,我们之前一直使用

self.navigationController.navigationBarHidden
或者self.navigationController.navigationBar.hidden来隐藏navigatiuonbar,
这样直接更改属性的方式是不带动画的,

而且滑动时的转场动画页不为我们处理好,才导致了问出的出现.

文章重点:

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;

为我们完美的解决这样的问题,作者不用UINavigationController+FDFullscreenPopGesture,而是使用系统默认的API来尝试解决:

给自定义navigation添加侧滑转场动画:

#import "MyNavigationController.h"
@interface MyNavigationController()<UIGestureRecognizerDelegate>

@end

@implementation MyNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];

        // 获取系统自带滑动手势的target对象
        id target = self.interactivePopGestureRecognizer.delegate;

        // 创建全屏滑动手势,调用系统自带滑动手势的target的action方法
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];

        // 设置手势代理,拦截手势触发
        pan.delegate = self;

        // 给导航控制器的view添加全屏滑动手势
        [self.view addGestureRecognizer:pan];

        // 禁止使用系统自带的滑动手势
        self.interactivePopGestureRecognizer.enabled = NO;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 注意:只有非根控制器才有滑动返回功能,根控制器没有。
    // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器
    if (self.childViewControllers.count == 1) {
        // 表示用户在根控制器界面,就不需要触发滑动手势,
        return NO;
    }
    return YES;
}

@end

然后再创建3个ViewController来相互切换,第一个是隐藏navigationbar的,后面2个不隐藏
隐藏navigationbar的ViewController代码如下:

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

    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

不隐藏navigationbar的ViewController代码如下:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

附上使用- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated的效果图:

动画.gif

附上使用navigationController.navigationBar.hidden的效果对比:

非动画.gif

demo项目地址:https://github.com/CharmingLee/FullscreenPopGesture.Git

这个demo有缺点:
从右边忘左边划动也能触发侧滑操作,有手势冲突,并不完美。且调用官方私有API

另外:正是缺点的所在,和Cell的侧滑删除手势也是有冲突的,也就是说,免不了需要解决手势的冲突。

适用需求:最好不用,毕竟缺点明显

2.关于UINavigationController+FDFullscreenPopGesture请参考

这个三方实现(集成最简单、功能最全面):
参考://blog.sunnyxx.com/2015/06/07/fullscreen-pop-gesture/

相关文章

  • iOS侧滑返回

    相关原理 iOS侧滑返回,有三种方案可以实现(只考虑iOS7以后) 开启使用系统自带的侧滑返回self.navig...

  • iOS侧滑返回实现

    1. 使用官方API解决Navigation侧滑导致的Navigationbar异常显示和隐藏的问题 参考:htt...

  • iOS开源项目推荐|侧滑与右滑返回手势

    iOS开源项目推荐|侧滑与右滑返回手势

  • iOS之侧滑返回无需第三方,只需在自己的BaseNavContr

    iOS之侧滑返回无需第三方,只需在自己的BaseNavController添加大概20行代码即可 iOS之侧滑返回...

  • 侧滑返回实现

    前两天开发公司的项目,突然发现项目没有侧滑返回的功能。今天研究了一下。在网上找了资料,原来ios7之后系统自带的有...

  • iOS 侧滑返回

    iOS 侧滑返回 BBGestureBack iOS 全屏手势返回 滑动返回 pop 动画效果 这种手势主流App...

  • iOS侧滑返回

    效果图 交互式动画的实现过程 动画1、给UINavigationController添加代理,需实现UINavig...

  • iOS 侧滑返回

    也是在简书上看到 别人的文章,但只是说了一部分,不够全面,当我们的controller定义返回功能时,侧滑返回功能...

  • iOS侧滑返回

    如果系统的侧滑返回用不了了,可以尝试以下方法: 1 __weak typeof (self) weakSelf ...

  • ios 侧滑返回

    ios7开始 苹果增加了页面 右滑返回的效果;具体的是以UINavigationController为容器的Vie...

网友评论

      本文标题:iOS侧滑返回实现

      本文链接:https://www.haomeiwen.com/subject/ihxohxtx.html