首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》13.8 深入学习:再谈UIGestureRecognizer

关灯直达底部

本章只对UIGestureRecognizer做了一个简单的介绍,关于它的属性和委托方法还没有进行介绍。此外,iOS SDK还提供了若干其他的UIGestureRecognizer子类,读者也可以创建自己的UIGestureRecognizer子类。本节将对UIGestureRecognizer再做一个概要介绍,以帮助读者了解“UIGestureRecognizer可以做什么”。

当某个UIGestureRecognizer子类对象附着在UIView对象上时,这个子类对象会自动处理和触摸事件有关的UIResponder方法(例如touchesBegan:withEvent:)。UIGestureRecognizer子类对象都是很“贪婪的”,凡是附着了该子类对象的UIView对象,通常都不会再收到和触摸事件有关的消息,或者会延迟收到这类消息。修改UIGestureRecognizer对象的某些属性(例如delaysTouchesBegan、delaysTouches- Ended和cancelsTouchesInView),可以改变这种行为。如果要进一步修改UIGestureRecognizer对象处理触摸事件的逻辑,还可以为其实现特定的委托方法。

某些情况下,一个UIView对象可能会附着多个UIGestureRecognizer子类对象,并且其中的两个UIGestureRecognizer子类对象所识别的都是类似的手势。在这种情况下,通过调用UIGestureRecognizer的requireGestureRecognizerToFail:,可以将这两个UIGestureRecognizer子类对象“串”起来:只有当某个UIGestureRecognizer子类对象识别不出手势时,另一个子类对象才会开始识别。

掌握UIGestureRecognizer的关键是根据不同的UIGestureRecognizer子类,理解其各种状态的含义。总的来说,UIGestureRecognizer子类对象可以有以下几种状态:

·UIGestureRecognizerStatePossible·UIGestureRecognizerStateFailed

·UIGestureRecognizerStateBegan·UIGestureRecognizerStateCancelled

·UIGestureRecognizerStateChanged·UIGestureRecognizerStateRecognized

·UIGestureRecognizerStateEnded

多数情况下,UIGestureRecognizer子类对象会处于“可能”(UIGestureRecognizer- StatePossible)状态。当某个UIGestureRecognizer子类对象识别出特定的手势时,其状态会切换至“开始”(UIGestureRecognizerStateBegan)状态。如果某个UIGestureRecognizer子类对象的手势是可持续的(例如拖移),其状态就会切换至“变化后”(UIGestureRecognizer- StateChanged)状态,而且会保持该状态直到手势结束。在“变化后”状态中,只要手势发生了变化,UIGestureRecognizer子类对象就会向目标对象发送指定的动作消息。当手势结束时,UIGestureRecognizer子类对象会切换至“结束”(UIGestureRecognizerStateEnded)状态。

不是所有的UIGestureRecognizer子类对象都会有“开始”“变化后”和“结束”这三种状态。对某些识别“不连续”手势(例如按下)的UIGestureRecognizer子类,就只有一个“已识别”(UIGestureRecognizerStateRecognized)状态(UIGesture- RecognizerStateRecognized和UIGestureRecognizerStateEnded的值是相同的)。

UIGestureRecognizer子类对象是可以“取消的”(例如有电话进来),也可能会失败(例如根据当前的触摸事件不足以识别特定的手势)。当某个UIGestureRecognizer子类对象的状态发生变化时,该对象会向目标对象发送指定的动作消息。相应的动作方法可以根据UIGestureRecognizer子类对象的state属性执行不同的逻辑。

iOS SDK提供了多个UIGestureRecognizer子类,如UIPinchGestureRecognizer、UISwipeGestureRecognizer和UIRotationGestureRecognizer。这些子类对象都有自己的额外属性,可以用来调整其识别行为,具体的细节请读者参考相关文档。

如果iOS SDK提供的UIGestureRecognizer子类不能满足需要,读者还可以创建自己的 UIGestureRecognizer子类。具体的细节请读者参考UIGestureRecognizer文档的“Subclassing Notes”(如何创建UIGestureRecognizer子类)部分。