28

実際に次のページにスクロールしたときに、ページングを有効にしてスクロールビューのスムーズなアニメーションを再現しようとしています。のようですUIViewAnimationCurveEaseInOutが、「次のページ」ボタンが必要で、プログラムでスクロールをトリガーする必要があります。

これが私のコードです:

-(void) scrollToPage:(int)page
{
    UIScrollView *scrollView = contentView;
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, scrollView.contentOffset.y);
    [scrollView setContentOffset:offset animated: YES];     
    [self pageControlUpdate];
}

-(void) scrollToNextPage 
{
    [self scrollToPage:(pageControl.currentPage + 1)];
}

UIViewAnimationCurveEaseInOutの滑らかさを、setContentOffset、または で再現できませんscrollRectToVisible...醜い線形アニメーションで次のページに移動します

私も手動でアニメーション化しようとしました:

[UIView animateWithDuration:.5 delay:0 options:UIViewAnimationCurveEaseInOut animations:^{
    scrollView.contentOffset = offset;
} completion:^(BOOL finished) {    } ];

どこが間違っていますか?

4

4 に答える 4

21

独自のアニメーションを作成するたびに、パラメーターとしてNOを渡す必要があります。animated:

- (void)scrollToPage:(int)page
{
    UIScrollView *scrollView = contentView;
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, 
                                 scrollView.contentOffset.y);

    [UIView animateWithDuration:.5
                          delay:0
                        options:UIViewAnimationCurveEaseInOut
                     animations:^{
                         [scrollView setContentOffset:offset animated:NO];
                     } completion:nil];

    [self pageControlUpdate];
}
于 2012-06-14T11:15:48.950 に答える
6

パブリック API を使用することで、これが現在可能であるとは思えません。アニメーションの過程でユーザーの操作が必要ないと仮定すると、UIScrollView代わりに のサブビュー (つまり、スクロール ビューのコンテンツ) の位置をアニメーション化し、contentOffset完了時にアニメーションなしで調整する方がよいでしょう。次のようにできます。

- (void) scrollToPage:(int)page {
    UIScrollView *scrollView = contentView;
    scrollView.userInteractionEnabled = NO;
    CGPoint offset = CGPointMake(scrollView.bounds.size.width * page, scrollView.contentOffset.y);
    CGFloat delta = offset.x - scrollView.contentOffset.x;

    __block int animationCount = 0;
    for (UIView *view in scrollView.subviews) {
        [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            animationCount++;
            CGRect frame = view.frame;
            frame.origin.x -= delta;
            view.frame = frame;
        } completion:^(BOOL finished) {
            animationCount--;
            if (animationCount == 0) {
                scrollView.contentOffset = offset;
                for (UIView *view in scrollView.subviews) {
                    CGRect frame = view.frame;
                    frame.origin.x += delta;
                    view.frame = frame;
                }
                scrollView.userInteractionEnabled = YES;
            }
        }];
    }
}

これが期待どおりに機能することを確認できます。自分でテストしました。

于 2012-06-18T04:13:27.030 に答える
4
[UIView animateWithDuration:(Animation_Duration)
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                     [scroll setContentOffset:CGPointMake(PointX, PointY) animated:NO];
                      }
                     completion:^(BOOL finished){}];`
于 2012-11-30T13:32:06.697 に答える
3

このクラスは私の命を完全に救いました:

GitHub.comのMOScroll

それは持っています

- (void)setContentOffset:(CGPoint)contentOffset withTimingFunction:(CAMediaTimingFunction *)timingFunction duration:(CFTimeInterval)duration;

プライベートAPIと同じですが、すべてのパブリックメソッドと数学を使用します。

于 2013-02-14T03:10:53.347 に答える