2009-06-23 7 views
0

をサブクラスUIScrollViewのに変わり広く使用されています(フォーラムでの私の観察に基づく)。しかし、OS3でこのコードをコンパイルするとすぐに、これらのメソッドは呼び出されなくなりました。他の誰かがこの問題を見ていますか?文書化されていないメソッドを使用しない既知の修正はありますか?ソリューションでiPhone OS3は、私が</p> <p>touchesBeganをオーバーライドするUIScrollViewのサブクラスを持って

私の最初の試みは、ダウン私のコンテンツビューにすべてのtouchesBegan移動/ /エンドメソッドを移動するためだったと

delaysContentTouches = NOを設定します。 canCancelContentTouches = NO;

これは部分的に機能しましたが、ズームしたときに私にパンすることができませんでした。私の2回目の試行では、2回のタッチがあったときに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

これは素晴らしいです!状況を処理するための非常にエレガントな方法。 –

関連する問題