2009-06-23 44 views
0

我的UIScrollView的子類,覆蓋iPhone OS3變爲UIScrollView的子類

的touchesBegan:withEvent:方法 touchesMoved:withEvent:方法
touchesEnded:withEvent:方法

重寫這三個似乎是一種技術,它是廣泛使用(基於我在論壇中的觀察)。但是,只要我在OS3上編譯此代碼,就不再調用這些方法。有沒有其他人看到這個問題?是否有已知的修補程序不使用未記錄的方法?

我在溶液中的第一嘗試是所有的touchesBegan /移除/截止方法向下移動到我的內容視圖,設置

delaysContentTouches = NO; canCancelContentTouches = NO;

這部分工作,但讓我無法平移,當我放大。我的第二次嘗試只設置了canCancelContentTouches = NO,當有兩個觸摸(因此將捏合手勢傳遞給內容)。這種方法粗略,並沒有很好地工作。

任何想法?我的要求是滾動視圖必須處理平底鍋接觸,我必須處理縮放接觸。

回答

1

我的解決方案並不漂亮。基本上有一個包含內容視圖的滾動視圖。滾動視圖根本不實現touchesBegan,Moved,Ended。內容視圖維護一個指向他父節點的指針(在本例中稱爲「parentScrollView」)。內容視圖處理邏輯並使用[parentScrollView setCanCancelContentTouches:...]來確定是否讓父視圖取消觸摸事件(並因此執行滾動事件)。由於用戶很少在同一時間將兩個手指放在屏幕上,所以第一次觸摸必須被忽略,如果它很快跟在後面,那麼就會出現點擊計數邏輯。

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    if(parentViewIsUIScrollView) 
    { 
     UIScrollView * parentScrollView = (UIScrollView*)self.superview; 
     if([touches count] == 1) 
     { 
      if([[touches anyObject] tapCount] == 1) 
      { 
       if(numberOfTouches > 0) 
       { 
        [parentScrollView setCanCancelContentTouches:NO]; 
        //NSLog(@"cancel NO - touchesBegan - second touch"); 
        numberOfTouches = 2; 
       } 
       else 
       { 
        [parentScrollView setCanCancelContentTouches:YES]; 
        //NSLog(@"cancel YES - touchesBegan - first touch"); 
        numberOfTouches = 1; 
       } 
      } 
      else 
      { 
       numberOfTouches = 1; 
       [parentScrollView setCanCancelContentTouches:NO]; 
       //NSLog(@"cancel NO - touchesBegan - doubletap"); 
      } 
     } 
     else 
     {  
      [parentScrollView setCanCancelContentTouches:NO]; 
      //NSLog(@"cancel NO - touchesBegan"); 
      numberOfTouches = 2; 
     } 
     //NSLog(@"numberOfTouches_touchesBegan = %i",numberOfTouches); 
    } 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if(touchesCrossed) 
     return; 

    if(parentViewIsUIScrollView) 
    { 
     UIScrollView * parentScrollView = (UIScrollView*)self.superview; 
     NSArray * thoseTouches = [[event touchesForView:self] allObjects]; 

     if([thoseTouches count] != 2) 
      return; 
     numberOfTouches = 2; 


     /* compute and perform pinch event */ 

     [self setNeedsDisplay]; 
     [parentScrollView setContentSize:self.frame.size]; 
    } 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    touchesCrossed = NO; 
    if(parentViewIsUIScrollView) 
    { 
     numberOfTouches = MAX(numberOfTouches-[touches count],0); 
     [(UIScrollView*)self.superview setCanCancelContentTouches:YES]; 
     //NSLog(@"cancel YES - touchesEnded"); 
     //NSLog(@"numberOfTouches_touchesEnded = %i",numberOfTouches); 
    } 
} 
+0

這太棒了!處理這種情況的一種非常優雅的方式。 – 2009-10-18 18:39:52