https://blog.csdn.net/qq_17190231/article/details/84201956

2018年11月18日 16:52:39 FreeBaiShun 阅读数:66 标签: 开源项目 更多

个人分类: 我的开源代码
 

使用场景

当我们用UIScrollView类似控件时候往往会遇到个问题,它的滑动和系统侧滑返回有冲突导致系统侧滑返回不好使。这时候我们直接使用BSScrollViewEdgePop可以很快的解决问题。

使用方法

  1. pod ‘BSScrollViewEdgePop’
  2. 代码示例
#import <UIScrollView+BSScrollViewEdgePop.h>
[self.scrollView setEdgePop:self];
  • 1
  • 2

效果

代码分析

setEdgePop程序入口

- (void)setEdgePop:(UIViewController *)vc{
id target = vc.navigationController.interactivePopGestureRecognizer.delegate;
self.panGr = [[UIPanGestureRecognizer alloc] initWithTarget:target action:NSSelectorFromString(@"handleNavigationTransition:")];
[[UIApplication sharedApplication].keyWindow addGestureRecognizer:self.panGr];
} - (void)dealloc{
[[UIApplication sharedApplication].keyWindow removeGestureRecognizer:self.panGr];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 这里是在window上添加个手势,这个手势的目的是为了响应侧滑返回。其中target和handleNavigationTransition即使系统侧滑需要执行的方法。这里我们必须用拖拽手势,因为该方法内部要知道滑动的偏移量。
  2. 最后当销毁scrollVeiw时候在移除这个手势

侧滑返回处理

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

    if ([self panBack:gestureRecognizer]) {
return NO;
}
return YES;
}
  1. 这个方法会响应scrollVeiw的滑动,即scrollVeiw每次滑动时候都会调用该方法。在该方法内部利用panBack方法判断是否scrollView滑动的区域是侧滑返回的区域,如果是就返回NO,这样事件将会向下一级传递,即之前我们添加的手势将会执行,这样就实现了侧滑返回。当scrollView滑动的区域不是侧滑返回的区域就返回YES这样scrollView的滑动事件继续执行。

scrollVeiw滑动区域判断

- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {

    int location_X =0.15*BSEdgePopIPHONE_W;

    if (gestureRecognizer ==self.panGestureRecognizer) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [pan translationInView:self];
UIGestureRecognizerState state = gestureRecognizer.state;
if (UIGestureRecognizerStateBegan == state ||UIGestureRecognizerStatePossible == state) {
CGPoint location = [gestureRecognizer locationInView:self]; int temp1 = location.x;
int temp2 = BSEdgePopIPHONE_W;
NSInteger XX = temp1 % temp2;
if (point.x >0 && XX < location_X) {
return YES;
}
}
}
return NO; }
  1. location_X是定义侧滑偏移量
  2. translationInView方法获得侧滑的方向
  3. locationInView方法为了获得手指滑动的区域
  4. 这样判断方向是向右并且是在侧滑区域内返回YES,否则返回NO

BSScrollViewEdgePop的更多相关文章

随机推荐

  1. java调用python程序以及向python程序传递参数

    在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python ...

  2. javaScript设计模式之面向对象编程(object-oriented programming,OOP)(一)

    面试的时候,总会被问到,你对javascript面向对象的理解? 面向对象编程(object-oriented programming,OOP)是一种程序设计范型.它讲对象作为程序的设计基本单元,讲程 ...

  3. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

  4. ASP.NET Core中使用GraphQL - 第五章 字段, 参数, 变量

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  5. Bumblebee微服务网关的部署和扩展

    Bumblebee是.netcore下开源基于BeetleX.FastHttpApi扩展的HTTP微服务网关组件,它的主要作用是针对WebAPI集群服务作一个集中的转发和管理:作为应用网关它提供了应用 ...

  6. 一个用来爬小说的简单的Node.js爬虫

    小说就准备点天下霸唱和南派三叔的系列,本人喜欢看,而且数据也好爬.貌似因为树大招风的原因,这两作者的的书被盗版的很多,乱改的也多.然后作者就直接在网上开放免费阅读了,还提供了官网,猜想作者应该是允许爬 ...

  7. 如何在Eclipse中彻底修改一个项目名称

    在实际工作中,有时候为了赶时间,往往通过复制项目得到一个成型的框架.那么怎么才可以彻底修改项目名称呢? 1.web.xml 2.工作空间中找到当前项目下.project文件 3.工作空间中找到当前项目 ...

  8. nginx系列11:负载均衡哈希算法ip_hash与hash模块

    使用默认的round-robin负载均衡算法无法保证某一类请求只能由上游的某一台应用服务器处理,它只适用于AKF扩展中的水平扩展,如果要保证某一类请求只能由上游的某一台应用服务器处理,就需要用到AKF ...

  9. webstorm 2018.2.3 cmd+w无法关闭文件

  10. Webpack 4教程 - 第六部分 增强开发时体验

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/08/06/webpack-4-course-part ...