UIGestureRecognizer 的共存

在 iPhone 或 iPad 的開發中,除了用 touchesBegan / touchesMoved / touchesEnded 這組方法來控制使用者的手指觸控外,也可以用 UIGestureRecognizer 的衍生類別來進行判斷。用 UIGestureRecognizer 的好處在於有現成的手勢,開發者不用自己計算手指移動的軌跡。UIGestureRecognizer的衍生類別有以下數種:

  • UITapGestureRecognizer
  • UIPinchGestureRecognizer
  • UIRotationGestureRecognizer
  • UISwipeGestureRecognizer
  • UIPanGestureRecognizer
  • UILongPressGestureRecognizer

從命名上不難了解這些類別所對應代表的手勢,分別是 Tap(點一下)、Pinch(二指往內或往外撥動)、Rotation(旋轉)、Swipe(滑動,快速移動)、Pan (拖移,慢速移動)以及 LongPress(長按)。這些手勢類別在使用上也很簡單,只要在使用前宣告並掛到對應的視圖(UIView)元件上即可。

     
// 宣告一個 recognizer, 並加到需要偵測該手勢的 UIView 元件上
- ( void ) viewDidLoad {
     UISwipeGestureRecognizer * recognizer ;
     // handleSwipeFrom 是偵測到手勢後,所要呼叫的方法
     recognizer = [[ UISwipeGestureRecognizer alloc ] initWithTarget: self action: @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: self action: @selector ( handleSingleTapFrom )];
     singleTapRecognizer . numberOfTapsRequired = 1 ; // 單擊
     [ self . view addGestureRecognizer: singleRecognizer ];
    
     // 雙擊的 Recognizer
     UITapGestureRecognizer * double ;
     doubleRecognizer = [[ UITapGestureRecognizer alloc ] initWithTarget: self action: @selector ( handleDoubleTapFrom )];
     doubleTapRecognizer . numberOfTapsRequired = 2 ; // 雙擊
     [ self . view addGestureRecognizer: doubleRecognizer ];
    
     // 關鍵在這一行,如果雙擊確定偵測失敗才會觸發單擊
     [ singleRecognizer requireGestureRecognizerToFail: doubleRecognizer ];
     [ singleRecognizer release ];
     [ doubleRecognizer release ];
}

如此一來,在第一下點擊後,如果有迅速點擊第二下,就會觸發  doubleRecognizer;反之要是隔了一小段時間,造成  doubleRecognizer 發生 fail,就會回頭觸發 singleRecognizer 了。
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值