Iphone 带非线性动画的UIScrollview setContentOffset?

Iphone 带非线性动画的UIScrollview setContentOffset?,iphone,ios,ipad,uiscrollview,Iphone,Ios,Ipad,Uiscrollview,我试图在您实际滚动到下一页时,在启用分页的情况下重现scrollview的平滑动画。它似乎是UIViewAnimationCurveEaseInOut,但我需要一个“下一页”按钮,并以编程方式触发滚动 这是我的密码: -(void) scrollToPage:(int)page { UIScrollView *scrollView = contentView; CGPoint offset = CGPointMake(scrollView.bounds.size.width *

我试图在您实际滚动到下一页时,在启用分页的情况下重现scrollview的平滑动画。它似乎是
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) {    } ];

我错在哪里

每次制作自己的动画时,都必须将作为
动画:
参数传递:

- (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];
}

由于使用了公共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;
            }
        }];
    }
}

我可以确认这是预期的效果,我自己测试过。

这门课绝对救了我的命:

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

它有

-(void)setContentOffset:(CGPoint)contentOffset
withTimingFunction:(CAMediaTimingFunction*)timingFunction
持续时间:(CFTimeInterval)持续时间


与私有API一样,但具有所有公共方法和数学。

我发现:这证实了我所看到的:
setContentOffset:animated:method将内容滚动到指定的内容偏移量。如果动画参数为“是”,则滚动将以恒定速率从当前位置动画到指定位置。
arg。没有人会有任何线索?好吧,如果
UIViewAnimationCurveEaseInOut
不起作用,那可能是另一条动画曲线。苹果很可能会使用自定义曲线来制作动画。使用
CAPropertyAnimation
,您可以以
camediatiming函数的形式定义自己的自定义曲线。这可能值得在不同的控制点玩一玩。我无法让它工作。你知道使用CAPropertyAnimation的教程或代码示例吗?顺便说一句,固定动画时间在某些情况下看起来很奇怪。e、 只需滚动2行,也需要半秒钟。另一个方向,如果你有一个非常非常长的列表,并且你从上到下滚动,它将在半秒钟内超快。谢谢你的解释,但我只滚动一整页宽度,所以看起来总是一样的速度。我尝试了动画:没有参数,但它一直以固定的速度滚动。我还尝试更改UIViewAnimationCurve动画,但它看起来是一样的。我正在尝试Ole的自定义CAPropertyAnimation解决方案。这非常有效。小挑剔虽然,它应该是UIViewAnimationOptionCurveEaseInOut。伟大的答案,最好在这里!是的,这是一个有趣的替代方案。但是我确实需要使用realtime contentOffset值在滚动时将我的视图移动到scrollview中,并且此解决方案不会触发scrollviewdidscroll。当您在最后设置
contentOffset
时,它会触发
scrollviewdidscroll
。但是,您可以提取在
scrollViewDidScroll
中执行的任何额外处理,并在该方法中使用它。或者,您可以将所有
UIScrollView
子视图嵌入到另一个
UIView
中,您可以将其子类化并覆盖
setFrame:
,因为在动画中,它本质上等同于
scrollViewDidScroll