ios开发——UIPanGestureRecognizer判定方向

有时我们在做拖动功能的时候会用到UIPanGestureRecognizer手势,例如之前封装过的一个侧滑导航栏:

ios开发——仿新版QQ侧滑导航栏的实现

今天在用这个导航栏的时候发现一个问题,UIPanGestureRecognizer是任何滑动手势都会辨别,它不像UISwipeGestureRecognizer一样有方向,这样就会导致如果导航栏的MainView不是UIScrollView或者UITableView的话上下滑动会出现视图消失的错误,这是因为上下滑动也会触发手势的响应方法。

因此我们需要在手势响应方法中自己判断方向并作出调整。

一些不怎么可行的方法:

由于在写的时候写上了三种状态,Begin,Changed,Ended,若仅仅是对Pan手势判定方向,那么调用translationInView:方法并判断其x、y的正负即可,但是在这里如果只是简单的在Changed中判定偏移并return的话会出现操作不流畅,滑到中间如果上移手势的话就不能再拉了。

只是简单地这样处理用户体验并不好

而如果在Begin中return是没有用的,因为当你滑动的时候依旧会调用这个响应方法并调到Changed状态的代码块中执行,在Begin中禁用手势的话更糟,一旦上下滑动,你的手势就永久失灵了,我想不到能在哪里让手势重新生效。

我的解决方法:

static BOOL canMoveView = YES;

在响应方法的开头加上这一句,在之后的操作中就用这个方法决定是否可以拉出,注意必须是static的,因为这个方法会在拉的过程中被反复调用,static将该变量放到静态存储区,只初始化一次,在每次调用该方法时canMoveView都保留着上次调用函数后的结果。

接着在Begin块中进行判断

if (recognizer.state == UIGestureRecognizerStateBegan) {
        //0 或者 self.leftOffsetX 或者 self.rightOffsetX
        currentOffsetX = _mainView.transform.tx;

        if ([recognizer translationInView:_mainView].y != 0) {
            canMoveView = NO;
            return;
        }
    }

如果用户是上下滑动的,那么置该标识符为NO,这样在Changed块中就可以根据这个标识符的值来做出响应的响应,而且由于只有在begin中才进行判断,所以当用户已经开始拉导航栏的时候,即时上下滑动手指也不影响流畅性了。

 if (recognizer.state == UIGestureRecognizerStateChanged) {

        if (!canMoveView) {
            return;
        }

<span style="white-space:pre">	</span>//下略

当然,为了保证上下滑动后,下一次还能拉出这个导航栏,还得在Ended块中置该值为YES,表明不管这次滑动是否有效,下一次滑动默认都为有效。

 if (recognizer.state == UIGestureRecognizerStateEnded) {
        //......

        canMoveView = YES;
}

这样就能在不影响用户体验的情况下禁止Pan手势的上下滑动了。

时间: 2024-10-06 00:23:42

ios开发——UIPanGestureRecognizer判定方向的相关文章

iOS开发中图片方向的获取与更改

iOS开发中 再用到照片的时候  或多或少遇到过这样的问题  就是我想用的照片有横着拍的有竖着排的  所以导致我选取图片后的效果也横七竖八的   显示效果不好 比如: 图中红圈选中的图片选取的是横着拍的图片 所以显示的头像也是横着的 显示效果不佳 问题描述: 使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现导出的照片方向会有问题,要么横着,要么颠倒着,需要旋转才适合观看.而如果直接在这些设备上浏览时,照片会始终显示正确的方向,

iOS开发 UIPanGestureRecognizer手势抽象类

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panIt:)];  // 初始化手势类 [view  addGestureRecognizer:panGesture];   // 将手势类添加给view - (void)panIt:(UIPanGestureRecognizer *)panGesture { CGPoint pos

iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件.远程控制事件等展开学习: iOS事件简介 触摸事件 手势识别 运动事件 远程控制事件 iOS事件 在iOS中事件分为三类: 触摸事件:通过触摸.手势进行触发(例如手指点击.缩放) 运动事件:通过加速器进行触发(例如手机晃动) 远程控制事件:通过其他远程设备触发(例如耳机控制

iOS开发之手势识别汇总

iOS开发之手势识别汇总 iOS开发中手势识别有六种: 轻击手势(TapGestureRecognizer), 轻扫手势 (SwipeGestureRecognizer), 长按手势(LongPressGestureRecognizer), 拖动手势(PanGestureRecognizer), 捏合手势(PinchGestureRecognizer), 旋转手势(RotationGestureRecognizer), 1,轻击手势(TapGestureRecognizer) UITapGest

iOS开发——淫技篇&amp;iOS开发中各种淫技总结(五)

淫技篇&iOS开发中各种淫技总结(五) ARC的使用: ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露,不过引起这些内存泄露的主要原因是:block,retain循环,对CoreFoundation对象(通常是C结构)管理不善,以及真的是代码没写好. reuseIdentifier 在iOS程序开发中一个普遍性的错误就是没有正确的为UITableViewCells.UICollectionViewCells和UITableViewHeaderFooterViews设置r

转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

-- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件.远程控制事件等展开学习: iOS事件简介 触摸事件 手势识别 运动事件 远程控制事件 iOS事件 在iOS中事件分为三类: 触摸事

iOS开发之手势识别

感觉有必要把iOS开发中的手势识别做一个小小的总结.在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextView中的手是用storyboard添加的.下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单.和button的用法类似,也是目标动作回调,话不多说,切入今天的正题.总共有六种手势识别:轻击手势(TapGestureRecogniz

iOS开发中六种手势识别

iOS开发中手势识别有六种: 轻击手势(TapGestureRecognizer), 轻扫手势 (SwipeGestureRecognizer), 长按手势(LongPressGestureRecognizer), 拖动手势(PanGestureRecognizer), 捏合手势(PinchGestureRecognizer), 旋转手势(RotationGestureRecognizer), 1,轻击手势(TapGestureRecognizer) UITapGestureRecognizer

iOS开发——UI篇OC篇&amp;UIDynamic详解

iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现象 2.物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 3.知名的2D物理引擎 Box2d Chipmunk 二.使用