2011-10-13 2 views
0

私はUIScrollViewサブクラスを使って作業しています。特定のイベントをキャッチしようとしていますが、私はそれに近づく方法を失っています。 基本的に私は水平なuiscrollviewを持っていて、それはオフにバウンスしています。私がスクロールビューのどちらかの端までスクロールすると、スクロール表示が終了するはずです。ユーザーが現在占有しているコンテンツの終わりの方向にスワイプしようとすると、イベントをキャッチしたいと思っています。つまり、ユーザーが右にスクロールして、もう一度右にスワイプしようとすると、どのようにこのジェスチャーをキャッチしますか。uiscrollviewキャッチスクロールの試行

私は、uiscrollviewサブクラスにジェスチャー認識子を追加しようとしましたが、最後に到達すると、スクロールが有効になり、これらのジェスチャーが捕捉されます。しかし、ユーザが利用可能な方向にスワイプしようとすると、スクロールがオフになるとスクロール効果は起こりません。すなわち、ユーザが右にスクロールした場合、スクロールがオフにされたときに何も起こらず、右への可能なジェスチャをキャッチするように、左にスクロールしようとする。

特定の方向にスクロールしようとする試みをキャッチする方法についてのアイデアはありますか? ありがとう

答えて

1

イベントをキャッチする1つの方法は、バウンスをプロパティーYESに設定し、停止したイベントを実装することです。スクロールビューのサブクラスで自分自身をバウンスします。 setContentOffsetメソッドをオーバーライドすると、スクロール先の座標を置き換えることができます。これが起こると、他のことも起こさせることができます。

-(void)setContentOffset:(CGPoint)contentOffset 
{ 
    CGPoint validOffset = [self validVersionOfOffset:contentOffset]; 

    if(contentOffset.x == validOffset.x) 
    { 
     [super setContentOffset:validOffset]; 
    } 
    else 
    { 
     [super setContentOffset:validOffset animated:NO]; 
     [bounceCatchDelegate scrollViewTriedBouncing:self]; 
    } 
} 

-(void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 
{ 
    CGPoint validOffset = [self validVersionOfOffset:contentOffset]; 
    [super setContentOffset:validOffset animated:animated]; 
    if(contentOffset.x == validOffset.x) 
    { 
     [super setContentOffset:validOffset animated:animated]; 
    } 
    else 
    { 
     [super setContentOffset:validOffset animated:NO]; 
     [bounceCatchDelegate scrollViewTriedBouncing:self]; 
    } 
} 

-(CGPoint)validVersionOfOffset:(CGPoint)offset 
{ 
    //Prevents bouncing at the left and right: 
    offset.x = fminf(offset.x, self.contentSize.width-CGRectGetWidth(self.frame)); 
    offset.x = fmaxf(offset.x, 0.0f); 
    return offset; 
} 

デリゲートの使用は単なる提案であり、どのメソッド呼び出しも機能します。私はcontentoffsetをチェックした場合

(UIScrollViewの*)scrollView {}:(空)scrollViewWillBeginDragging -

+0

は私のために働くことができませんでしたが、将来の仕事のためにいいアイデアを見せてくれました+1 – glogic

+0

何がうまくいかなかったのですか?私は助けることができるかもしれませんか? – Aberrant

+0

私のuiscrollviewサブクラスは で作成されています。@interface WallScrollView:UIScrollView {}と私は、上からsetcontentoffsetコードを入れました。これはすべてのsetcontent呼び出しをうまく捕らえます。しかし、行[super setcontentoffset:validoffset]が私のためにクラッシュする – glogic

0

これは回避策ですが、実際にはcontentSizeを大きく設定できます。次に、scrollViewDidScrollデリゲートメソッドで、スクロールビューのcontentOffsetを確認できます。希望の値よりも高い場合は、それをキャップに戻して、必要な値を設定します。多分、それは視覚的には良く見えませんが、うまくいくかもしれません。あなたの目標が何であるかを伝えるのは難しいです。

+0

よくスクロール表示が全画面表示され、ユーザーがコンテンツをスワイプしようとすると、スクロールビュー全体を画面外に移動して別のビューに置き換えたいと考えています。あなたがショットを提案してあなたに戻ってくるものを教えてください – glogic

0

はちょっとそのきれいではありません一緒に何かをハッキングが、使用して

をオフにバウンスして

開始を作業しますスクロールビューのいずれかの端で私はそうそれとしてフラグを立て、バウンスをオンとして設定します。その後、

に - (無効)scrollViewDidScroll:(UIScrollViewの*)scrollView {}

私もここで、それの中contentoffsetが、その後スクロールオフにスクロールコンテンツの終わりのいずれかを超えて行くと設定されていることを確認しますコンテンツビューを終了位置に移動します。以下はコードです。非常に厄介で、完全にそれを恥ずかしがっているが、それをうまく扱っていない。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ 

    int t = self.contentOffset.x; 
    if (t==0) { 
     leftSet = YES; 
     rightSet = NO; 
     self.bounces = YES; 
    } else if (t>=imagePosX-480) {//if scrollview reaches the end 
     rightSet = YES; 
     leftSet = NO; 
     self.bounces = YES; 
    } 

} 


-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 

    int t = self.contentOffset.x; 

    if (t<=0) { 
     if (leftSet) { 
      self.bounces = NO; 
      self.scrollEnabled = NO; 

      //perform code i wanted here 


     } 


    } else if (t>=imagePosX-480) {//if scrollview reaches the end then snap back to start 

     if (rightSet) { 
      self.bounces = NO; 
      self.scrollEnabled = NO; 
      //perform code i wanted here 

     } 

    } 
    else{ 
     rightSet = NO; 
     leftSet = NO; 
     self.bounces = NO; 
    } 



} 

私は決して上記を推奨していますが、それは働いていて、残念なことに大きなフライフィッシュを持っています。私は収差を私のために働く方法に近づきました。確かに誰かが彼の作品を悪意のあると回答した場合は、それを答えとして投票します。

0

は、私の場合は、scrollViewのためのcontentSizeは、使用した後に設定していた:

とすぐに、ユーザはナンがヒットし、例外がトリガされたscrollviewにズーム始めたことを意味し
self.scrollView.minimumZoomScale = (self.scrollView.frame.size.width/self.scrollView.contentSize.width); 

を。