2010-06-03 47 views
2

我有一個顯示PDF的視圖。它應該是可縮放的,所以我也創建了一個UIScrollView,並在其委託中實現了viewForZoomingInScrollView以返回PDF視圖。到現在爲止還挺好。 但是,當用戶到達放大的PDF頁面的邊緣時,我想翻到下一頁。聽起來很容易,但我似乎無法弄清楚如何去做。如何過濾UIScrollView的觸摸事件?

我已經嘗試了一些不同的方法:

  1. 使用scrollViewDidScroll來檢測,如果滾動已經達到了邊緣。這裏的問題是,如果zoomScale是1,因此不可能滾動,那麼這個函數永遠不會被調用。但是UIScrollView仍然會吞下所有的觸摸事件,所以我也無法檢測到touchesMoved中的邊緣。如果不縮放不是一個選項,則將canCancelContentTouches設置爲NO,因爲這樣也會阻止放大。

  2. 子類化UIScrollView,並將某些觸摸事件轉發給下一個響應者。不幸的是,當UIScrollView檢測到拖動操作並取消觸摸時,即使對於UIScrollView子類,touchesMoved和touchesEnded也不會被調用。同樣,將canCancelContentTouches設置爲NO也不好,因爲這也會阻止某些所需的UIScrollView功能。

  3. 在滾動視圖(作爲其兄弟)頂部創建一個透明視圖,以便此視圖首先獲取所有觸摸事件,然後將某些觸摸轉發給滾動視圖。不幸的是,滾動視圖不響應這些調用。

  4. 我不能使用touchesShouldCancelInContentView,因爲沒有得到實際的觸摸作爲參數,我是否希望滾動視圖處理觸摸事件也取決於觸摸事件本身的屬性(例如,我們已經處於邊緣的方向上的觸摸移動不應該被滾動視圖取消,而是在另一方向上的移動可能是)。

看起來像什麼的UIScrollView正在做的是從的touchesBegan/touchesMoved發起的,而是它得到的觸摸方式之前一些通知。可能以一些我無法攔截,無法複製的無證方式。

那麼有沒有什麼辦法可以通過UIScrollView獲得關於所有觸摸動作的通知,同時仍然可以使用(當某些條件適用時)UIScrollView用於縮放和滾動?

回答

0

好了,這裏就是我做到底:

  • 使所有的滾動和縮放最多的UIScrollView,並在UIScrollViewDelegate的scrollViewDidEndDragging處理轉到頁willDecelerate:是幾乎的解決方案,除了如果整個內容在屏幕上,此功能從不會被調用,所以拖放/滾動是不可能的。
  • 在這種情況下,Swipe在ViewController的touchesBegan/touchesEnded函數中處理,但爲了這個工作,我們需要確保UIScrollView不會取消這些事件。但是,在其他情況下,UIScrollView應該能夠取消觸摸,以便它可以進行縮放和滾動。
  • 的UIScrollView中應該能夠抵消觸摸,如果:
    • 滾動是可能的(需要),因爲整個內容不適合在屏幕上(zoomScale> 1在我的情況), 或
    • 的用戶用兩個手指觸摸屏幕,以便放大和縮小。
  • 當滾動是不可能的,並且用戶單擊屏幕,那麼觸摸不應該被取消,觸摸事件應該被轉發到視圖控制器。

  • 所以我創建了一個UIScrollView子類。

  • 該子類有一個指向ViewController的屬性。
  • 使用touchesXXX方法我跟蹤當前的觸摸計數。
  • 我將所有觸摸事件轉發給ViewController。
  • 最後,我重寫touchesShouldCancelInContentView:和返回NO時zoomScale < = 1和touchCount == 1