IOS开发之手势——UIGestureRecognizer 共存
在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外,也可以用 UIGestureRecognizer 的衍生类別来进行判断。用 UIGestureRecognizer 的好处在于有现成的手势,开发者不用自己计算手指移动轨迹。UIGestureRecognizer的衍生类別有以下几种:
UITapGestureRecognizer
UIPinchGestureRecognizer
UIRotationGestureRecognizer
UISwipeGestureRecognizer
UIPanGestureRecognizer
UILongPressGestureRecognizer
从命名上不难了解這些类別所对应代表的手势,分別是 Tap(点一下)、Pinch(二指往內或往外拨动)、Rotation(旋转)、Swipe(滑动,快速移动)、Pan (拖移,慢速移动)以及 LongPress(长按)。這些手势別在使用上也很简单,只要在使用前定义并添加到对应的视图上即可。
// 定义一个 recognizer, 并加到需要偵測该手势的 UIView 元件上
- (void)viewDidLoad {
UISwipeGestureRecognizer* recognizer;
// handleSwipeFrom 是偵測到手势,所要呼叫的方法
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom)];
// 不同的 Recognizer 有不同的实体变数
// 例如 SwipeGesture 可以指定方向
// 而 TapGesture 則可以指定次數
recognizer.direction = UISwipeGestureRecognizerDirectionUp
[self.view addGestureRecognizer:recognizer];
[recognizer release];
}
- (void)handleSwipeFrom:(UISwipeGestureRecognizer*)recognizer {
// 触发手勢事件后,在这里作些事情
// 底下是刪除手势的方法
[self.view removeGestureRecognizer:recognizer];
}
问题來了。有些手势其实是互相关联的,例如 Tap 与 LongPress、Swipe与 Pan,或是 Tap 一次与Tap 兩次。当一個 UIView 同时添加兩个相关联的手势时,到底我这一下手指头按的要算是 Tap 还是 LongPress?如果照預设作法来看,只要「先滿足条件」的就会跳出并呼叫对应方法,举例来说,如果同时注册了 Pan 和 Swipe,只要手指头一移动就会触发 Pan 然后跳出,因而永远都不會发生 Swipe;单点与双点的情形也是一样,永远都只会触发单点,不會有双点。
那么这个问题有解吗?答案是肯定的,UIGestureRecognizer 有个方法叫做requireGestureRecognizerToFail,他可以指定某一个 recognizer,即便自己已经滿足條件了,也不會立刻触发,会等到该指定的 recognizer 确定失败之后才触发。以同时支持单点与双点的手势为例,代码如下:
- (void)viewDidLoad {
// 单击的 Recognizer
UITapGestureRecognizer* singleRecognizer;
singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSingleTapFrom)];
singleTapRecognizer.numberOfTapsRequired = 1; // 单击
[self.view addGestureRecognizer:singleRecognizer];
// 双击的 Recognizer
UITapGestureRecognizer* double;
doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleDoubleTapFrom)];
doubleTapRecognizer.numberOfTapsRequired = 2; // 双击
[self.view addGestureRecognizer:doubleRecognizer];
// 关键在这一行,如果双击确定偵測失败才會触发单击
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
[singleRecognizer release];
[doubleRecognizer release];
}
http://www.cnblogs.com/iphone520/archive/2011/10/27/2226548.html
分享到:
相关推荐
【标题】"iOS实例开发源码——JTStackController for iOS.zip" 提供的是一个iOS应用开发的源代码示例,其中的核心是JTStackController。JTStackController是一个自定义的视图控制器容器,它允许开发者在iOS应用中...
【标题】"iOS实例开发源码——JPButton for iOS.zip" 涉及的主要知识点是iOS应用开发中的自定义控件设计,特别是针对UIButton的扩展和优化。在iOS开发中,自定义控件通常用于实现特定的设计需求或者增强用户体验。...
该实例的源码包含在“iOS实例开发源码——PhotoAppLink for iOS.zip”压缩包内,我们可以从中学习到如何构建类似的功能,提升我们的iOS开发技能。 首先,我们关注的是“photoapplink.png”,这通常是一个应用的图标...
【iOS实例开发源码——JMWhenTapped for iOS】是一个针对iOS平台的开源项目,它提供了用户界面元素(如按钮或视图)被点击时触发特定事件的功能。这个项目可以帮助开发者更好地理解和实践iOS应用中的触摸事件处理,...
【标题】"iOS实例开发源码——KKGridView for iOS.zip" 涉及的主要知识点是KKGridView,这是一个专为iOS平台设计的可定制化的网格视图控件。KKGridView是基于Apple的UITableView进行扩展和改造的,它允许开发者在...
与大家分享一些iOS开发的学习资料,对开发入门或者是想提升技术高度的同学可能会比较有用,希望可以帮助到大家,祝大家都能够学习进步,事业有成! 精通ios开发介绍了iOS中UI设计模式,iOS中详细ui控件介绍,并...
《iOS实例开发源码——kristianbauer-PixelPuzzles-6ed81ee.zip》是一个关于iOS应用开发的源代码项目,由开发者kristianbauer创建。这个项目名为"PixelPuzzles",它很可能是一个图像拼图游戏,其中包含了许多iOS开发...
《iOS实例开发源码——jacksinn-simon-442e226》 这个压缩包文件"iOS实例开发源码——jacksinn-simon-442e226.zip"显然包含了iOS应用开发的相关源代码。从标题我们可以推测,这可能是由开发者jacksinn或Simon创建的...
这个"IOS实例开发源码——局域网或蓝牙连接.zip"文件提供了一个实际的案例,帮助开发者理解和掌握这两种通信方式。以下是相关知识点的详细说明: 1. **MultiPeerConnectivity框架**: - MultiPeerConnectivity是...
【标题】"iOS实例开发源码——FloWi-MyGeekGameBoard-d29a624.zip" 提供的是一个iOS应用的源代码,该项目名为FloWi-MyGeekGameBoard,版本号为d29a624。这个项目可能是开发者用于教学、学习或者分享的一个游戏板应用...
iOS实例开发源码——daryldudey-Skirmish-1778723.zip
iOS实例开发源码——csddavies-DDGameKitHelper-af15184.zip
iOS实例开发源码——cmkilger-Vici-558464e.zip
iOS实例开发源码——dmpatierno-PunchHipster-96a8275.zip
iOS实例开发源码——dangerbell-WheatKings-ce45f22.zip
iOS实例开发源码——dopiaza-Run-210b0bf.zip
iOS实例开发源码——codypo-ShipwreckAdventure-ae3098a.zip
iOS实例开发源码——crunchysue-Telephone-642e35c.zip
iOS实例开发源码——CouleeApps-ArrowMaze-d8ab976.zip
iOS实例开发源码——CharleneJiang-CubeFun-c5175fd.zip