2013-01-05 13 views
7

私は透明なUIViewの下にUIScrollViewを持っています。私はすべてのパンとタップをスクロールビュー(水平方向にのみスクロール)に転送する必要があります。通常のUIViewでは、UIPanGestureRecognizerのサブクラスを使用して垂直パン(Subclass found here)を追跡します。オーバーレイビューでは、タッチイベントメソッドをオーバーライドしてUIScrollViewに渡します。別のUIViewの下でUIScrollViewにタッチ情報を渡す

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    [self.scrollView.panGestureRecognizer touchesBegan:touches withEvent:event]; 
    [self.scrollView.singleTapGesture touchesBegan:touches withEvent:event]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
    [self.scrollView.panGestureRecognizer touchesCancelled:touches withEvent:event]; 
    [self.scrollView.singleTapGesture touchesCancelled:touches withEvent:event]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 
    [self.scrollView.panGestureRecognizer touchesEnded:touches withEvent:event]; 
    [self.scrollView.singleTapGesture touchesEnded:touches withEvent:event]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 
    [self.scrollView.panGestureRecognizer touchesMoved:touches withEvent:event]; 
    [self.scrollView.singleTapGesture touchesMoved:touches withEvent:event]; 
} 

オーバーレイビューは、垂直パンが完全に機能します。 UIScrollViewでは、タップも完全に機能します。しかしスクロールするほどではない。スクロールビューは約3点をスクロールし、次に停止します(水平のパンを続けると)。私がベロシティを放つと、スクロールビューはそのベロシティをピックアップしてスクロールします。

スクロール表示がスクロールを停止してからベロシティをピックアップする可能性のある問題は何ですか?

答えて

2

あなたが投稿したコードから、私は透明なUIViewを使って何もしていないと仮定します。次に、あなたは単にuserInteractionEnabled = NOを設定しないでください。 ??

+0

透明ビューは、スワイプなどの少なくとも1つのタイプのタッチに応答する必要があると仮定します。 –

+0

Uhmm ...なぜあなたのスクロールが停止し、速度をピックアップするのか分かりませんが、私がやったことは..私のUIScrollViewはすべてのイベントを処理します。そのイベントをそのUIViewに渡すコールバック関数を作る...また、UIView ..のuserInteractionEnabledを無効にする。そうすれば、UIScrollViewはそれを想定した方法で動作する。UIViewは、UIScrollViewがキャッチして渡すために想定される唯一のイベントを処理するそれはUIViewに...多分あなたが戻ってそれを変更するには遅すぎるかもしれません..しかし、申し訳ありませんあなたの問題を解決する方法を知らない。 – chuthan20

0

はここで私のためによく働い簡単に解決策です:

を透明UIViewのでは幅と高さを作る(のは、それをOverlayView呼びましょう)の両方0(ビューはUIScrollViewの上に、もはや技術的にしないように) clipsToBounds = NO(オーバーレイビューの内容がUIScrollViewの上に表示されるように)を設定します。 OverlayViewは、(上記のボタンのような)インタラクティブなコントロールが含まれている場合、彼らが機能しなくなりますことを

self.OverlayView.clipsToBounds = NO; 
CGRect frame = self.OverlayView.frame; 
self.OverlayView.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0); 

は注意してください。 UIScrollViewの上にそれ自身のビューに移動する必要があります。

0
#import "CustomUiView.h" 

@implementation CustomUiView.h 

-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event{ 
    return NO; 
} 
@end 

あなたが対話したくないビューです。 カスタムUIViewクラスを作成し、このカスタムビューをトップビューとして使用して、pointInsideメソッドでNOを返します。その後、タッチは自動的にアンダースレになります。あなたの場合、透明なUIViewはUIViewのCustomUiViewサブクラスになります。

関連する問題