2012-01-03 5 views
11

ページングを有効にしてUIScrollViewを取得しました。自分自身にUIPanGestureRegonizerを追加しました。場合によっては、ビューコントローラがscrollview.scrollEnabled = NOに設定され、パンジェスチャ認識機能が追加されます(私はスクロールビュー独自の認識機能を使用していません)。UIPanGestureRecognizerとUIScrollViewを連続してスクロールする

スクロールは無効になっていますが、ジェスチャ認識機能からユーザーが触れるのを待っています。それが認識されると、私はスクロールを再び有効にするアクションを呼び出します。

問題は、まだユーザーが指を押している間、私のスクロールビューは指で追跡していないということです。指が持ち上げられてから再びドラッグされるまで、スクロールは開始されません。だから、私のジェスチャーレコグナイザーはすべてのタッチを飲み込んでおり、スクロールビューには何も転送していません。

私はpanGestureRecognizer.cancelsTouchesInView = NO;をトグルしようとしましたが、効果がないようです(スクロールを再び有効にするとすぐにこの認識機能が削除されていますが、 。またdelays...のプロパティーを調べたところ、UIGestureRecognizerのいずれも役に立ちませんでした。

アイデア?これらのイベントをスクロールビューに転送し続けるにはどうすればよいですか?

+0

あなたは '' gestureRecognizerでYES'を返してみました:shouldRecognizeSimultaneouslyWithGestureRecognizer: 'メソッド? – Hejazi

+0

@Hejaziはい私はデリゲートメソッドも実装しています(そして私の代理人を設定しました)が、指がまだダウンしている間は呼び出されません(一旦取り上げてから再度指を置くと、 。 – jbrennan

答えて

5

iOS 5以降をターゲットにしている場合は、UIScrollView panGestureRecognizerプロパティを実際に再利用する必要があるため、答えが少し簡単になります。

いずれの場合でも、重要なステップはscrollEnabledを再利用しないことですが、代わりにUIScrollViewをサブクラス化し、独自のプロパティを作成してこの状態を管理し、setContentOffset:をオーバーライドします。

  1. サブクラスUIScrollViewの(または、あなたのニーズに応じて、UIScrollViewのサブクラスの別のサブクラス):

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

    ここに1つの可能なのiOS 4+ソリューションです。

  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; 
    } 
    
関連する問題