精华内容
下载资源
问答
  • ios 全屏返回手势

    千次阅读 2019-04-03 10:52:00
    苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操作。 这个操作的...

    感谢前人的无私奉献.  简书原文 ,  优化有bar,无bar的切换

    前言

    苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操作。

    这个操作的想法非常好,但是系统给我们规定的范围必须是屏幕左侧边缘才可以触发,这样实际使用过程中对于有些产品会产生不便,于是有些app就采取整个屏幕都响应这个手势并且pop动画还是用系统原生的,这样操作起来确实方便好多。

     

    推荐使用:Runtime+KVC

    为了方便大家阅读下面的代码,我们需要先了解系统的这个手势。

    前面我们了解到,这个手势属于UINavigationController,我们就跳到它的头文件里看看能不能找到线索。这个思路是正确的,确实有一个手势叫做interactivePopGestureRecognizer。属性为readonly,就是说我们不能给他换成自定义的手势,但是可以设置enable=NO。ok,既然找到了它,就打印一下看看它到底是一个什么手势。

    通过log,我们看到他属于UIScreenEdgePanGestureRecognizer这个类(之前我是没有用到过),它继承自UIPanGestureRecognizer,出现在IOS7以后,是专门处理在屏幕边缘触发的手势类型,并且只有一个属性叫edges,用来设置它的触发边缘(上、下、左、右、全部)。

    我们继续看它的log。控制台除了打印了它的类,还打印了它的触发target:_UINavigationInteractiveTransition(这是一个私有类,看来是专门用来做导航控制器交互动画的),和action:handleNavigationTransition(这是它的一个私有方法),我们要做的就是新建一个UIPanGestureRecognizer,让它的触发和系统的这个手势相同,这就需要利用runtime获取系统手势的target和action。

    那么如何获取这个target呢?一开始我用kvc想直接获取这个手势的target,程序崩溃了,原来它根本没有这样一个属性。所以我能想到的是,先利用runtime遍历它的所有成员变量,看看系统是怎么存储这个属性的,

     

     

    通过log我们可以看到,UIGestureRecognizer有一个叫_targets的属性,它的类型为NSMutableArray。


    它是用数组来存储每一个target-action,所以可以动态的增加手势触发对象。那么又是什么存储每一个target-action呢?为了了解这个我们拿到这个属性的名字"_targets"通过kvc获取它,接着打印出来。

     

    可以看到,由于系统重写了它的description方法,所以我们没办法通过打印获取这个对象是什么类型。既然不能打印,那么我们就用断点调试,来看它的真实类型,

    我们看到,原来每一个target-action是用UIGestureRecognizerTarget这样一个类来存储的,它也是一个私有类。
    苹果把许多的类做私有化也是有原因所在,其实在平时我们拿到这个类也是没有用的,他们的目的之一是避免对开发者公开无用的类,影响了封装性。所以在类的设计上,还是要向苹果学习。

    下面直接看代码。

    我们在控制器的ViewDidLoad加上这段代码,并且它只需要执行一次。

     

     

    优化

    这个demo我会提供给大家,下面简单说下程序的优化思路。

    • 优化点一:对于方案一,其实不应该把导航控制器的代理方法以及手势处理的方法交给视图控制器,因为这段代码不是属于某一个视图控制器,而是全局的导航控制器,所以我们应该参考苹果的设计思想:新建一个专门管理交互过程的对象,这个类我们叫做NavigationInteractiveTransition。

    • 优化点二:再来看之前的ViewDidLoad中只执行一次的代码,其实写在这里也不够妥当,同样的,这段代码也不属于某一个Controller,优化方案是新建一个导航控制器,在这个导航控制器的viewDidLoad中写上这些代码,这样也并不需要dispatch once。

    • 优化点三:由于我们自定义的手势是加在一个私有view上,这个view是一个全局的,所以当这个控制器为根控制器时,我们的手势还是在起作用,这就相当于对根控制器做了pop操作,这会出现一个错误nested pop animation can result in corrupted navigation bar。导致这个错误的原因还有一个,如果我们pop的动画正在执行,再去触发一次手势,会导致导航控制器和导航条的动画混乱。为了避免问题出现我们需要成为手势的代理,判断当前控制器是否为根控制器并且pop或者push动画是否在执行(这个变量是私有的,需要用kvc来获取)。

       

      经过最后的优化,视图控制器可以什么都不写,想使用这个效果,只要使用我们自定义的导航控制器就可以了,这样的好处是手势动画与控制器完全解耦,并且不用给每一个控制器都addGesture。


    给大家推荐一个仓库https://github.com/nst/iOS-Runtime-Headers,这个仓库可以调取苹果的所有私有方法头文件,相当强大。

    最后放上这个demo的地址:https://github.com/zys456465111/CustomPopAnimation(使用时,切换工程的scheme就能切换不同方案。对于方案二,只需要导航控制器的类就可以了。)

    pod 'FDFullscreenPopGesture'

    还发现了一个问题, 比如前一个页面是没有NavigationBar , 后一个页面有NavigationBar , 最好在前一个页面通过这种方式设置导航栏隐藏,如果直接使用     self.navigationController.navigationBarHidden = YES ;  没有设置动画的, 通过手势pop回来的时候,导航栏的位置是有很强的割裂感,嗯,就是很丑.

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

     

    展开全文
  • iOS 手势返回详解

    千次阅读 2018-05-30 11:06:16
    iOS 手势返回详解 BBGestureBack iOS 全屏手势返回 滑动返回 pop 动画效果 这种手势主流App 我要去下载 点赞 :BBGestureBack 现在市场上的主流app都有用到各种侧滑手势,大体上分为2种, 一种是:类似于淘宝...

    iOS 手势返回详解

    BBGestureBack
    BBGestureBack iOS 全屏手势返回 滑动返回 pop 动画效果

    这种手势主流App

    我要去下载 点赞 :BBGestureBack
    现在市场上的主流app都有用到各种侧滑手势,大体上分为2种
    一种是:类似于淘宝、京东、腾讯、斗鱼的效果,带导航栏的。如图:
    淘宝效果
    京东效果
    腾讯效果
    斗鱼效果

    一种是:类似于微信,不带导航栏,如图:

    微信效果

    支持OC、Swift:最低适配iOS 7.0

    BBGestureBack不仅支持OC还支持Swift,最低适配iOS7.0,iOS主流的全屏手势返回、滑动返回、pop动画效果都有,适配各种iPhone,嵌入简单,只需按照Demo集成,就能完美使用。(集成最简单、功能最全面)

    支持OC、Swift

    BBGestureBack手势效果

    不仅仅手势返回可以有动画、就连pop也有效果。

    BBGestureBack手势效果

    BBGestureBack如何使用?

    按照Demo集成就可以了,注意:

    • 是否使用效果

      @property (nonatomic) Boolean isEnablePanGesture;//default is YES.

    • pop的返回方式

     - (void)bb_popViewController;
     - (void)bb_popToViewController:(UIViewController*)viewController;
     - (void)bb_popToRootViewController;
    • 参数
    UIKIT_EXTERN const CGFloat BBDistanceToLeft;//距离左边响应的范围
    UIKIT_EXTERN const CGFloat BBWindowToScale;//缩放大小(淘宝、京东没有缩放...)
    UIKIT_EXTERN const CGFloat BBMaskingAlpha;//背景透明度
    UIKIT_EXTERN const CGFloat BBGestureSpeed;//返回的速度
    UIKIT_EXTERN const CGFloat BBDistanceToPan;//手势拖拽的长度

    上传图片说明:
    BBGestureBack参数说明

    BBGestureBack 系统全屏效果

    系统全屏效果

    BBGestureBack点赞及下载

    我要去点赞下载

    展开全文
  • 好像写这个有点晚了,iOS已经从拟物化的年代进化到了扁平化的年代,那些圆角+渐变+阴影的年代已经过去,不过在此仍然要去说下古老的iOS返回按钮。 在过去的年代,大家都以iOS的设计元素为自己移动版页面的设计...
  • iOS 配置全局侧滑返回手势

    千次阅读 2018-05-08 15:01:57
    其实如果使用系统的返回按钮,不用leftBarButtonItem或者leftBarButtonItems进行自定义,那么系统会自带侧滑返回功能。...因为如此便会覆盖原有的侧滑返回手势的代理,所以我的解决思路是重新给UINa...

    其实如果使用系统的返回按钮,不用leftBarButtonItem或者leftBarButtonItems进行自定义,那么系统会自带侧滑返回功能。但是在实际的开发中都会按照自己的需求对返回按钮进行自定义,如果通过上边两种方式进行自定义了,或者在当前的视图中添加了UIScrollView等滚动视图后侧滑返回的手势就会自动失效。因为如此便会覆盖原有的侧滑返回手势的代理,所以我的解决思路是重新给UINavigationController添加代理

    1 创建一个继承于UINavigationController的类作为全局的导航控制器,然后在里边添加侧滑代理

    - (void)viewDidLoad {
        [super viewDidLoad];
        // 重新设置侧滑手势的代理
        __weak typeof(self) weakSelf = self;
        if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.interactivePopGestureRecognizer.delegate = (id)weakSelf;
        }
    }

    2 设置完成之后所有在该导航控制器下的ViewController就有了侧滑的返回功能,但是如果是根控制器侧滑就会出现问题,当我在根控制器侧滑之后想再次push出新的控制器后就会失效。如果根控制器侧滑三次则需要push四次之后才可以出现新的视图,所以要通过手势的代理方法对根控制器的侧滑手势进行处理

    // 开始接收到手势的代理方法
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
        // 判断是否是侧滑相关的手势
        if (gestureRecognizer == self.interactivePopGestureRecognizer) {
            // 如果当前展示的控制器是根控制器就不让其响应
            if (self.viewControllers.count < 2 ||
                self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
                return NO;
            }
        }
        return YES;
    }

    3 此时可以说已经完成了大部分的全局侧滑返回手势,但是如果在当前视图添加了UIScrollView等滚动视图后会发现侧滑功能消失了,因为滚动视图可以接收并响应侧滑手势,该手势就传递不到导航控制了,所以想要在存在滚动视图的控制器也存在侧滑返回功能就要对多手势事件进行处理

    // 接收到多个手势的代理方法
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        // 判断是否是侧滑相关手势
        if (gestureRecognizer == self.interactivePopGestureRecognizer && [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
            UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
            CGPoint point = [pan translationInView:self.view];
            // 如果是侧滑相关的手势,并且手势的方向是侧滑的方向就让多个手势共存
            if (point.x > 0) {
                return YES;
            }
        }
        return NO;
    }

    备注:

    调用此方法禁用侧滑返回功能

    [self.navigationController.interactivePopGestureRecognizer setEnabled:NO];

    此方法将会把navigationController后边的所有ViewController侧滑手势禁用,所以我推荐在所有ViewController基类的viewDidLoad中开启全局的侧滑功能,然后在相应禁止侧滑的控制器中的viewDidAppear中禁止侧滑。


    记住一定要在viewDidAppear中禁止,如果在viewWillAppear中禁止当你push到下一个界面中再用侧滑返回的时候会先走上一个控制器的viewWillAppear将其侧滑禁止,导致下一个界面也会失去侧滑功能
    如果理解不了多看一下控制器的生命周期


    展开全文
  • iOS 禁用侧滑返回手势要点整理

    千次阅读 2018-05-10 10:39:21
    项目中可能某些页面返回按钮需要自定义,然后在点击返回按钮时做出某些判断,或者直接弹出到根控制器,这时候需要禁用侧滑返回手势,防止它不走判断的代码直接返回上个界面。 网上找了些资料,大致方法有两种,但要...

    项目中可能某些页面返回按钮需要自定义,然后在点击返回按钮时做出某些判断,或者直接弹出到根控制器,这时候需要禁用侧滑返回手势,防止它不走判断的代码直接返回上个界面。

    网上找了些资料,大致方法有两种,但要注意的点没有提到,容易出错,这里整理下:

    需要:A - > B - > C,要求B页面禁用侧滑返回

    1. B推到C,C页面可以侧滑返回;

    2. B弹回A,再从A推D,D要可以侧滑返回。

    方法一:

    在乙页面的生命周期设置如下代码

     

    -(void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        }
    }
    -(void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        };
    }


    注意:

     

    1,是在viewDidAppear里面禁用导航的侧滑手势,不要在viewWillAppear中中设置!

    如果在viewWillAppear中中禁用了手势,你会发现B->Ç之后,在Ç界面侧滑返回时,APP会进入假死状态。原因是乙界面将要出现时,你禁用了侧滑手势,导致Ç侧滑失败,界面卡住。所以要在乙界面出现之后,再禁用侧滑手势。

    2,要在viewWillDisappear里面激活导航的侧滑手势,不是viewDidDisappear!

    导航是共用的,如果不激活就返回了,其他页面也将无法侧滑返回!而在viewDidDisappear设置激活是无效的,要在页面即将消失时激活。

     

    方法二:

    也是在乙页面的生命周期设置如下代码。方法一是直接关闭和激活侧滑手势,方法二则是乙遵循协议UIGestureRecognizerDelegate,设置侧滑交互代理,重写手势方法。

     

    @property (weak, nonatomic) id<UIGestureRecognizerDelegate> restoreInteractivePopGestureDelegate;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        _restoreInteractivePopGestureDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
    }
    
    -(void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.navigationController.interactivePopGestureRecognizer.delegate = self;
        }
    }
    -(void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.navigationController.interactivePopGestureRecognizer.delegate = _restoreInteractivePopGestureDelegate;
        };
    }
    #pragma mark -UIGestureRecognizerDelegate
    -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
    {
        return NO;
    }
    


    这里主要解释下为什么要记录导航的侧滑手势代理:

     

    我们有时候会自定义的UINavigationController基类,里面可能已经设置了侧滑手势代理,所以在乙界面出现后我们重新设置代理为B,消失前我们要把代理重新改回为原来的。

     

    iOS 12以上方法禁用侧滑手势有效,但是在页面消失时激活侧滑手势无效了,倒是返回之后,再push新的页面,不能手势侧滑返回了。目前不知为何,有碰到且解决了的大兄dei留言指教一下,不甚感谢!

    展开全文
  • ios边缘返回手势

    千次阅读 2017-11-15 17:37:29
    self.navigationController.interactivePopGestureRecognizer.delegate = self; 可以在设置了导航栏左侧时候依旧可以边缘返回
  • 联系QQ: 712641411 开发作者: 吴海超 iOS技术交流群: 302157745 轻量级手势返回框架(简单,高效) ...ViewController * rootVC = .../// 该rootNV 队列下所有VC控制器都将支持自定义触摸手势返回Pop操作
  • 苹果在iOS7.0以后推出了一个侧滑返回手势,当导航栏Push到下一页时,可以通过侧滑手势pop到上一页,这大大提高了用户的体验度,同时增加了可玩性。 然而有些时候,当你push到另一个界面后,如果该界面有Scrollview或...
  • $(function(){ pushHistory(); var bool=false; setTimeout(function(){ bool=true; },1500); window.addEventListener("popstate", function(e) { if(bool) { //执行自己想要执行的事件 ...
  • iOS 手势滑动返回功能

    千次阅读 2016-06-23 11:06:15
    BaseViewController 是要添手势的控制器 BaseViewController.m #import "BaseViewController.h" #import "POPAnimation.h" @interface BaseViewController ()...
  • iOS WKWebView 左滑手势 返回H5上级页面

    千次阅读 2020-08-28 09:56:57
    // handleNavigationTransition:为系统私有API,即系统自带侧滑手势的回调方法,我们在自己的手势上直接用它的回调方法 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self...
  • iOS 一个丝滑的全屏滑动返回手势

    千次阅读 2016-05-09 18:01:04
    全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的...
  • 禁用滑动返回手势需要在改界面的ViewController中添加如下代码: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // 禁用返回手势 if ([self.navigationController ...
  • 此前苹果发布的iPhnoe X便第一次取消了home键,以追求更高的屏占比。而近日,据xda消息,谷歌正尝试更改Android Q的手势操作。在据xda透露,谷歌在Android Q上有两项重大的改动:一是:把传统的底部三键改成两键,...
  • iOS 右滑手势返回上一级

    万次阅读 2016-07-05 17:49:02
    但是如果我们从从导航控制器的返回按钮,就发现系统所带的侧滑返回功能无法使用,而且有些功能不尽人意,所以有以下自定义方法。 1.全屏手势滑动 - (void)viewDidLoad { [super viewDidLoad]; // 获取系统自带...
  • 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的返回...
  • iOS7之后,苹果优化了一个小功能,就是对于UINavagationController堆栈里的UIViewController,只要轻轻在视图控制器的左边缘右滑一下,该视图控制器就会pop出栈(前提当然是对于非根视图控制器而言)。实现方法很...
  • 仿今日头条右滑返回效果,支持手势操作 推荐给大家一个swift扩展库,支持cocoapods,地址:https://github.com/CoderZCC/ZCategoryTool, 欢迎Star
  • 做右滑返回手势配置时,可能会遇到的问题:   1. 右滑返回手势为什么失效?   2. 右滑返回手势如何全局开启及怎么避免页面卡死?   3. 特定页面停用右滑手势后如何再次开启?   4. 右滑返回手势与滚动视图...
  • 第一步:进入 设置-> 辅助功能 -> 切换控制 第二步:设置一个切换 ...在手势录制界面你操作一次你想要的手势 返回到上一次的界面,就完毕了 第四步:启动方案选择为你要的手势 第五步:
  • 滑动返回手势的禁用与开启

    千次阅读 2017-02-20 15:27:50
    在ios7以后,苹果推出了手势滑动返回功能,也就是从屏幕左侧向右滑动可依返回上一个界面。... 禁用滑动返回手势需要在改界面的ViewController中添加如下代码: [objc] view plain co
  • 手势返回对用户而言是一个很便捷的操作,苹果原生支持,而 Android 到如今都没有考虑过这件事,所以只能有 App 开发者自己来完成。这里单独建立arch Module,把手势滑动和activity和fragment跳转动画都集中在这个...
  • iOS手势返回的取消与开启

    千次阅读 2019-04-16 15:55:50
    - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated];... // 禁用返回手势 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { se...
  • iOS关于右滑手势返回上一级

    千次阅读 2019-04-18 02:27:16
    首先iOS7以后系统默认自带了侧滑功能,当用户在界面的...系统自定义的优点在于,当界面中有其它易冲突手势(像某控制器界面本身的轻扫或左滑右滑手势)时,系统滑动方法是边缘手势,与其它手势的作用区域可能会有...
  • 主要为大家详细介绍了iOS禁用右滑返回的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 全屏滑动返回手势

    2015-09-01 17:25:51
    全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的返回...
  • 现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效。 [cpp] view plaincopy if ([self.navigati
  • 刚开始使用Mac的用户可能不太会使用Mac多点触控手势,了解苹果MacOSX系统常用多点触摸板操作手势能够让用户更好的使用Mac电脑,那么那么如何在Mac上使用多点触控手势?下面带来详细的MacOSX系统常用多点触摸板操作...
  • Mac触控板Magic Trackpad的常用手势

    千次阅读 2020-11-02 19:28:31
    手势 选中 单指单击 打开文件 单指双击 拖动窗口 将指针拖到窗口顶部,单指移动 双指 命令 手势 右键功能 使用两个手指点击 滚屏 双指上下移动 放大缩小网页内容 双指张开捏合 前后翻页 ...
  • iOS一个丝滑的全屏滑动返回手势

    千次阅读 2016-12-20 16:44:50
    全屏返回手势  自 iOS7 之后,Apple 增加了 屏幕边缘右划返回 交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,236
精华内容 2,094
关键字:

苹果返回手势