7

これが私のオーバーライドコードです-スナップする場所を計算するだけです:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    if(targetContentOffset->y < 400) {
        targetContentOffset->y = 0;
        return;
    }

    int baseCheck = 400;

    while(baseCheck <= 10000) {
        if(targetContentOffset->y > baseCheck && targetContentOffset->y < baseCheck + 800) {
            targetContentOffset->y = (baseCheck + 340);
            return;
        }
        baseCheck += 800;
    }

    targetContentOffset->y = 0;
}

スクロールビューをドラッグするために指を 1 ~ 2 秒以上押したままにしてから指を離すと、通常はその場所にアニメーションが表示されます。ただし、簡単な「フリック」を行うと、ほとんどアニメーション化されず、targetContentOffset にスナップするだけです。デフォルトのページング動作をエミュレートしようとしています (カスタム位置へのスナップを除く)。

何か案は?

4

1 に答える 1

6

結局、手動でアニメーション化する必要がありました。同じ関数で、targetContentOffset をユーザーが中断した場所 (現在の contentOffset) に設定して、独自のアニメーションをトリガーしないようにしてから、contentoffset を計算に設定します。さらに、「自動」ページ変更をトリガーする速度チェックを追加しました。完璧ではありませんが、同じ問題を抱えている他の人に役立つことを願っています。

(誰も私の計算を見る必要がないので、読みやすくするために上記の関数を変更しました)

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    CGPoint newOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y);
    *targetContentOffset = CGPointMake([broadsheetCollectionView contentOffset].x, [broadsheetCollectionView contentOffset].y);

    if(velocity.y > 1.4) {
        newOffset.y += pixelAmountThatWillMakeSurePageChanges;
    }
    if(velocity.y < -1.4) {
        newOffset.y -= pixelAmountThatWillMakeSurePageChanges;
    }

    // calculate newoffset

    newOffset.y = calculatedOffset;
    [scrollView setContentOffset:newOffset animated:YES];
}
于 2013-03-06T18:05:23.563 に答える