swift 觸控事件傳遞很難介入控制,除非子類化UIApplication修改 sendEvent(event:)
UIGestureRecognizer (高優先) > UIControl(如 UIButton)
整個觸控事件流程分為二個階段,三種事件。
單一個 View 的觸控交互::
// event is Tap
// view = 第一響應者
// gestureRecognizers : 所有的 gest
// controls: 第一響應者如果為 UIControl的 Controls
// UIGestureRecognizer 階段
// 從已添加 UIGesture 取出最後加入的 tap 事件
// 從已添加
// 其他運動軌跡以此類推
beginTracking()
touchBegan()
if let gest = gestureRecognizers.lastIndex(where: { $0 === tap } {
// 執行觸控事件
gest.launchAction()
// 檢查是否繼續傳遞 event
guard !gest.cancelsTouchesInView else {
vuew.touchesCancel()
return
}
// UIResponder 與 UIControl 階段
view.touchesEnded()
// (if view === UIControl)
if beginTracking {
view.endTracking()
view.actions.forEach { if $0.event == tap { $0.launchAction() } }
}
return
}
// 無符合 Gesture事件
// 執行 UIResponder 與
view.touchesEnded()
// (if view === UIControl)
if beginTracking() {
view.endTracking()
view.actions.forEach { $0.event == tap { $0.launchAction() } }
}
// 如果需要取消追蹤
if needCancelTrack {
view.cancelTracking()
}
view raw觸控解說偽代碼.swift hosted with ❤ by GitHub
總結