6

水平方向のUIScrollViewがあります。「プルしてリセット」アニメーションのバリエーションを実行したいのですが、スクロールビューのコンテンツサイズの右端を完全に超えて引っ張り、指を離して、スクロールビューを(0、0)に戻します。 )コンテンツオフセット。

私のデリゲートメソッドは次のようになります。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    //check if it exceeds a certain critical value
    if (scrollView.contentOffset.x - (scrollView.contentSize.width - IMAGE_WIDTH) > 80) {
        [self doAnimatedScrollTo:CGPointMake(0, 0)];
    }
}

doAnimatedScrollTo:アニメーションの長さを制御したいので、カスタムアニメーションメソッドが必要です。

これは機能しますが、アニメーションはキューに入れられているようです。UIScrollViewの「バウンス」アニメーションが最初に発生し、次にアニメーションが発生します。

バウンスアニメーションをキャンセルし、コンテンツオフセットが「スナップ」バックしないようにしてから、アニメーションを実行する方法はありますか?

4

2 に答える 2

3

これを試して

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
  //check if it exceeds a certain critical value
  if (scrollView.contentOffset.x - (scrollView.contentSize.width - IMAGE_WIDTH) > 80) {
    [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
  }
}
于 2013-09-05T10:13:21.513 に答える
2

UIScrollViewのバウンスバックアニメーションのキャンセルを完了しました。

バウンスしたときに上にすばやくスクロールするときのデフォルトの動作をそのままにしておきたいと思いました。ただし、scrollviewがすでに一番上にあり、ユーザーがそれをプルダウンしてリリースした場合(プルして更新するのと同じように)、バウンスを制御して、何かカスタムを実行したいと思いました。

scrollviewデリゲートで、初期位置を追跡します。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < 0.1)
    {
        isPullingTop = YES;
    }
}

scrollviewデリゲートで、フラグが設定され、scrollviewが十分にドラッグされているかどうかを検出します

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (isPullingTop && scrollView.contentOffset.y < -30) {

        overrideBounce = YES;
    }
    isPullingTop = NO;
}

scrollviewをサブクラス化し、setContentOffsetをオーバーライドします。

-(void)setContentOffset:(CGPoint)contentOffset
{
    if (!overrideBounce)
    {
        [super setContentOffset:contentOffset];
    }
    else
    {
        //customs stuff goes here , for example an animation
        overrideBounce = NO;
    }
}
于 2013-10-15T19:06:29.393 に答える