iPhone OS3のUIScrollViewサブクラスへの変更
-
06-07-2019 - |
質問
オーバーライドするUIScrollViewのサブクラスがあります
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
これら3つをオーバーライドすることは、(フォーラムでの私の観察に基づいて)広く使用されている手法のようです。ただし、OS3でこのコードをコンパイルするとすぐに、これらのメソッドは呼び出されなくなります。他の誰かがこの問題を見ましたか?文書化されていないメソッドを使用しない既知の修正はありますか?
最初の解決策の試みは、すべてのtouchesBegan / Moved / Endedメソッドをコンテンツビューに移動して設定することでした
delaysContentTouches = NO; canCancelContentTouches = NO;
これは部分的に機能しましたが、ズームするとパンできなくなりました。 2回目のタッチの場合、2回目の試行ではcanCancelContentTouches = NOのみが設定されます(したがって、ピンチジェスチャがコンテンツに渡されます)。この方法は大ざっぱで、うまく機能しませんでした。
アイデアはありますか?私の要件は、スクロールビューがパンタッチを処理し、ズームタッチを処理する必要があることです。
解決
私の解決策はきれいではありません。基本的に、コンテンツビューを含むスクロールビューがあります。スクロールビューは、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);
}
}