zoukankan      html  css  js  c++  java
  • BSScrollViewEdgePop

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

    使用场景

    当我们用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
  • 相关阅读:
    FastDFS安装配置过程中出现错误提示"/home/yuqing/fastdfs" can't be accessed, error info: No such file or directory
    dubbo-monitor安装监控中心,管理控制台安装网页一直访问不到,解决bug的方式记录
    dubbo-monitor安装监控中心,管理控制台安装
    zookeeper伪分布式集群安装
    zookeeper单节点安装
    JedisCluster操作redis集群demo
    Redis Cluster集群的搭建
    redis3.0.6安装配置
    Windows注册表中修改CMD默认路径
    eclipse中使用mybatis-generator逆向代码生成工具问题解决记录
  • 原文地址:https://www.cnblogs.com/sundaysgarden/p/10748812.html
Copyright © 2011-2022 走看看