簡體   English   中英

同時使用平移和滑動手勢識別器

[英]Using Pan and Swipe gesture recognisers simultaneously

我在ViewController的底部有一個視圖(類似於Google Maps Bottom Sheet)。 目標是:

  1. 平移時,視圖朝平移方向移動(基本上跟隨手指),平移結束時,視圖變為全屏顯示。 到目前為止一切順利。

  2. 添加滑動手勢。 向上滑動時,視圖應全屏顯示。

問題是,按照定義,滑動手勢是平移手勢,而不是相反。 因此,除非我平移的速度非常慢,否則即使我仍在屏幕上拖動,滑動手勢也會觸發並且視圖將變為全屏。

只是平移看起來並不像我正在尋找的那種滑動。 im描述的滑動手勢僅應在用戶暫時“輕拂”視圖時觸發。 如果他們繼續平移,則平移手勢應優先。

任何想法如何實現這一目標? 作為參考,您可以在android或ios上檢查一下Google地圖上的圖釘。

如果不顯示它很難描述,所以它是否有助於我非常開放地澄清事情。

更新

  1. 我認為,按我所描述的那樣會覆蓋平移的滑動的區別是:a)花費了很短的時間才能完成b)手勢以用戶將手指從屏幕上移開而結束c)(可能錯了)遍歷不應太大。 對我來說聽起來很像輕彈。

如果您無法用明確定義的術語來描述兩個手勢之間的差異,那么將很難告訴UIGestureRecognizer如何做到。 另外,如果您的手勢過於相似或過於復雜,您的用戶可能會難以確定如何與屏幕進行正確交互。

話雖如此,您可以通過檢查手勢的速度來區分“滑動”和“搖動”。 您應該可以使用UIGestureRecognizerDelegate方法並達到所需的效果。

好的,我已經實現了所需要的。 簡短的答案是我正在尋找“輕拂”手勢而不是平移手勢。 通常,它是添加自定義手勢的一種方法,但是當我為ios復制google maps底部表單組件時,自定義手勢似乎是唯一的方法。

使用Navillus的注釋,我在平移識別器中添加了速度和手勢結束檢查。 結果看起來像這樣:

if(recognizer.state == .ended){
        if(recognizer.velocity(in: self).y > CGFloat(500) ){
            self.pullUpViewSetMode_SUMMARY()
            return;
        }

        if(recognizer.velocity(in: self).y < CGFloat(-500) ){
            self.pullUpViewSetMode_FULL()
            return;
        }
}
//the rest of the pan handling code, namely translating the view up and up follows here

希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM