UIScrollview setContentOffset与非线性动画?

时间:2012-06-10 17:25:43

标签: iphone ios ipad uiscrollview

当您实际滚动到下一页时,我正在尝试重现滚动视图的平滑动画,并启用分页。它似乎是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 个答案:

答案 0 :(得分:21)

每次制作自己的动画时,都必须将作为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];
}

答案 1 :(得分:6)

使用公共API,我认为目前不可能。假设您在动画过程中不需要用户交互,那么您最好设置动画UIScrollView子视图的位置(即滚动视图的内容),然后调整{{ 1}}完成后没有动画。你可以这样做:

contentOffset

我可以确认这是按预期工作的,我自己测试了。

答案 2 :(得分:4)

[UIView animateWithDuration:(Animation_Duration)
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                     [scroll setContentOffset:CGPointMake(PointX, PointY) animated:NO];
                      }
                     completion:^(BOOL finished){}];`

答案 3 :(得分:3)

这堂课绝对拯救了我的生命:

MOScroll on GitHub.com

它有

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

就像私有API一样,但是包含所有公共方法和数学。