shouldBeRequiredToFailByGestureRecognizer
和 shouldRequireFailureOfGestureRecognizer
是UIKit中的兩個(gè)手勢(shì)識(shí)別器(GestureRecognizer)代理方法洪碳,它們用于處理多個(gè)手勢(shì)識(shí)別器之間的交互和優(yōu)先級(jí)型宙。這兩個(gè)方法幫助決定當(dāng)多個(gè)手勢(shì)可能同時(shí)被識(shí)別時(shí)雀久,哪一個(gè)手勢(shì)應(yīng)該生效或失敗。但它們的角度和用途有所不同:
-
shouldBeRequiredToFailByGestureRecognizer:
這個(gè)方法被調(diào)用在另一個(gè)手勢(shì)識(shí)別器(作為參數(shù)傳遞的那個(gè))上喂柒,詢問(wèn)當(dāng)前手勢(shì)識(shí)別器是否應(yīng)該在另一個(gè)手勢(shì)識(shí)別器成功之前失敗。換句話說(shuō),這個(gè)方法是用來(lái)確定當(dāng)前手勢(shì)是否要有更低的優(yōu)先級(jí)痹换,需要等待其他特定的手勢(shì)識(shí)別器失敗后才能嘗試識(shí)別泻帮。此方法在UIGestureRecognizerDelegate
協(xié)議中定義精置,其原型如下:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool
如果返回true,則表示當(dāng)前手勢(shì)識(shí)別器應(yīng)該在otherGestureRecognizer失敗后才嘗試識(shí)別锣杂;如果返回false脂倦,則不改變它們的默認(rèn)優(yōu)先級(jí)關(guān)系。
-
shouldRequireFailureOfGestureRecognizer:
相比之下元莫,這個(gè)方法是在設(shè)置一個(gè)手勢(shì)識(shí)別器時(shí)使用赖阻,用來(lái)指定它需要等待另一個(gè)特定手勢(shì)識(shí)別器失敗后才能開(kāi)始嘗試識(shí)別。這是在手勢(shì)識(shí)別器實(shí)例化并配置時(shí)設(shè)置的踱蠢,而不是通過(guò)代理方法火欧。也就是說(shuō),當(dāng)你初始化一個(gè)手勢(shì)識(shí)別器并希望它在另一個(gè)手勢(shì)失敗后才激活時(shí)茎截,你將使用這個(gè)方法來(lái)建立這種依賴關(guān)系苇侵。這不是一個(gè)代理方法,而是一個(gè)直接在手勢(shì)識(shí)別器上配置的屬性或方法(盡管具體實(shí)現(xiàn)細(xì)節(jié)可能因不同的子類而異)企锌。
用于控制手勢(shì)識(shí)別器之間相互作用的行為衅檀。它允許你定義一個(gè)手勢(shì)識(shí)別器只有在另一個(gè)手勢(shì)識(shí)別器未能識(shí)別到手勢(shì)時(shí)才能開(kāi)始嘗試識(shí)別。這在解決手勢(shì)沖突和定義交互優(yōu)先級(jí)時(shí)非常有用霎俩。
以下是使用 shouldRequireFailureOfGestureRecognizer
方法的一個(gè)基本示例場(chǎng)景和代碼示例哀军。假設(shè)你有一個(gè)滑動(dòng)手勢(shì)UISwipeGestureRecognizer
和一個(gè)捏合縮放手勢(shì)UIPinchGestureRecognizer
,你想要確保當(dāng)用戶嘗試捏合縮放時(shí)打却,滑動(dòng)手勢(shì)不會(huì)干擾:
- 首先杉适,你需要設(shè)置你的視圖控制器或其他合適的對(duì)象作為這兩個(gè)手勢(shì)識(shí)別器的代理,并且確保遵循
UIGestureRecognizerDelegate
協(xié)議:
class YourViewController: UIViewController, UIGestureRecognizerDelegate {
}
- 接著柳击,初始化你的手勢(shì)識(shí)別器猿推,并設(shè)置代理:
let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe))
swipeGesture.delegate = self
view.addGestureRecognizer(swipeGesture)
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch))
pinchGesture.delegate = self
view.addGestureRecognizer(pinchGesture)
- 然后,實(shí)現(xiàn)
shouldRequireFailureOfGestureRecognizer
方法以定義手勢(shì)的依賴關(guān)系。在這個(gè)例子中蹬叭,我們讓滑動(dòng)手勢(shì)swipeGesture
只有在捏合手勢(shì)pinchGesture
失敗時(shí)才嘗試識(shí)別:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer === swipeGesture && otherGestureRecognizer === pinchGesture {
return true
}
return false
}
在這個(gè)方法中藕咏,我們檢查傳入的手勢(shì)識(shí)別器是否是我們希望其依賴于另一個(gè)手勢(shì)失敗的手勢(shì),如果是秽五,則返回 true孽查,表明這個(gè)手勢(shì)識(shí)別器應(yīng)該等待另一個(gè)手勢(shì)失敗后再嘗試識(shí)別。
總結(jié)來(lái)說(shuō)坦喘,shouldBeRequiredToFailByGestureRecognizer
是一個(gè)代理回調(diào)盲再,動(dòng)態(tài)地決定手勢(shì)識(shí)別器間的優(yōu)先級(jí),而 shouldRequireFailureOfGestureRecognizer
是一種配置方式瓣铣,靜態(tài)地設(shè)定一個(gè)手勢(shì)識(shí)別器需要在其指定的手勢(shì)識(shí)別器失敗后才能開(kāi)始嘗試識(shí)別答朋。兩者都是為了管理復(fù)雜觸摸交互中手勢(shì)識(shí)別的順序和優(yōu)先級(jí),但應(yīng)用場(chǎng)合和使用方式有所不同棠笑。