2012-01-03 27 views
11

我已經有UIScrollView啓用了分頁功能,並且我已將它自己的UIPanGestureRegonizer添加到它。在某些情況下,我的視圖控制器將設置scrollview.scrollEnabled = NO,然後添加平移手勢識別器(我不使用scrollview自己的識別器)。UIPanGestureRecognizer和重新啓用的UIScrollView之間的連續滾動

因此,滾動被禁用,但我正在等待我的手勢識別器的用戶觸摸。當它識別時,它會調用其重新啓用滾動的操作。

問題是,雖然用戶仍然有手指向下,但我的滾動視圖不會用手指跟蹤。直到手指擡起然後再次拖動,它纔開始滾動。所以我的手勢識別器吞嚥了所有的觸摸,並且不會將任何內容轉發到滾動視圖。

我試過切換panGestureRecognizer.cancelsTouchesInView = NO;,但它似乎沒有任何效果(我目前刪除這個識別器,只要我重新啓用滾動,但是否我這樣做或沒有解決我的問題) 。我還研究了UIGestureRecognizerdelays...屬性,但它們似乎也沒有幫助。

任何想法?我怎樣才能讓這些事件繼續轉發到我的滾動視圖?

+0

你嘗試返回在''gestureRecognizer YES':shouldRecognizeSimultaneouslyWithGestureRecognizer:'方法? – Hejazi 2012-01-03 20:43:15

+0

@Hejazi是的,我也實現了這個委託方法(並設置了我的委託),但在手指仍然關閉的情況下它不會被調用(只有當我放棄並放下手指時,這個委託方法纔會被調用) 。 – jbrennan 2012-01-03 20:51:37

回答

5

如果你只針對iOS 5或更高版本,答案會簡單一些,因爲在這種情況下,你真的應該重用UIScrollView panGestureRecognizer屬性。

在任何情況下,關鍵步驟是不重用scrollEnabled,而是爲UIScrollView創建子類,創建自己的屬性來管理此狀態,並覆蓋setContentOffset :.

- (void) setContentOffset:(CGPoint)contentOffset 
    { 
     if(self.programaticScrollEnabled) 
      [super setContentOffset:contentOffset]; 
    } 

這裏是一個可能的iOS 4+解決方案:

  1. UIScrollView的子類(或子類UIScrollView中的一個小類,根據您的需要)。
  2. 覆蓋所有初始化程序以確保您的設置代碼被調用。
  3. 聲明BOOL屬性並覆蓋setContentOffset:如上所述。
  4. 在你的設置代碼,建立一個UIPanGestureRecognizer並設置你的狀態變量,允許程序上的滾動(假設這是你想要的默認狀態):

    panRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease]; 
    //These properties may change according to your needs 
    panRecognizer.cancelsTouchesInView = NO; 
    panRecognizer.delaysTouchesBegan = NO; 
    panRecognizer.delaysTouchesEnded = NO; 
    [self addGestureRecognizer:panRecognizer]; 
    panRecognizer.delegate = self; 
    
    self.programaticScrollEnabled = YES; 
    
  5. 管理可同時發生手勢。在我的情況下:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    { 
        return YES; 
    } 
    
  6. 在任何需要的地方轉動程序滾動。例如:

    - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
    } 
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
        return YES; 
    } 
    
相關問題