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. C/C++性能测试工具GNU gprof

    代码剖析(Code profiling)程序员在优化软件性能时要注意应尽量优化软件中被频繁调用的部分,这样才能对程序进行有效优化.使用真实的数据,精确的分析应用程序在时间上的花费的行为就成为_代码剖析 ...

  2. python进程和线程(四)

    线程同步条件.信号量及队列 同步条件(event) 下面是官方文档对event的一些解释: An event is a simple synchronization object; the event ...

  3. springboot + redis(单机版)

    本次和大家分享的是在springboot集成使用redis,这里使用的是redis的jedis客户端(这里我docker运行的redis,可以参考 docker快速搭建几个常用的第三方服务),如下添加 ...

  4. android学习笔记--检测是否为wifi环境

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // 获取 ...

  5. windows快捷键十八式(win10)

    胖友,如果你的电脑是windows系统,下面这十八招windows快捷键都不会,还敢说你会用windows? 说到windows的快捷键,当然不是只有ctrl+c,ctrl+v这么简单,今天我整理了一 ...

  6. Docker进阶之五:容器管理

    容器管理 一.创建容器常用选项 docker container --help 指令 描述 资源限制指令 -i, --interactive 交互式 -m,--memory 容器可以使用的最大内存量 ...

  7. HTML学习总结&基础篇

    何为坚持?一个“勤”,一个“忍”. 年前给自己定的目标,今年一定要坚持多逛园子,多看一些大佬的帖子,然后自己也尽量能够分享自己学习的收获,让自己进步快些,但是多逛园子是做到了,写博客这个东西,今年好像 ...

  8. spring2.0 mybatis JDBC配置

    mybatis 搭建 <!--连接池--> <dependency> <groupId>org.springframework.boot</groupId&g ...

  9. 简说Java线程的那几个启动方式

    本文首发于本博客 猫叔的博客,转载请申明出处 前言 并发是一件很美妙的事情,线程的调度与使用会让你除了业务代码外,有新的世界观,无论你是否参与但是这对于你未来的成长帮助很大. 所以,让我们来好好看看在 ...

  10. Oracle数据库的安装 【超详细的文图详解】

    Oracle简介Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库 ...