自动滚动UIScrollView,允许用户中断动画

时间:2013-10-11 14:26:47

标签: iphone ios animation uiscrollview xamarin.ios

我正在尝试在UIScrollView中为一堆图像制作动画。当屏幕显示时,图像应该开始滚动,我可以这样做。目前我正在使用UIView动画,如下所示:

    [Export("ScrollToRight")]
    private void ScrollRight()
    {
        if (!imagesShouldScroll)
            return;
        UIView.BeginAnimations("ScrollRight");
        UIView.SetAnimationCurve(UIViewAnimationCurve.Linear);
        UIView.SetAnimationDuration(test.Count * 10);
        scrlImages.ContentOffset = new PointF(((scrlImages.Frame.Height + 2) * test.Count) - scrlImages.Frame.Width, 0);
        UIView.SetAnimationDelegate(this);
        UIView.SetAnimationDidStopSelector(new Selector("ScrollToLeft"));
        UIView.CommitAnimations();
    }

    [Export("ScrollToLeft")]
    private void ScrollLeft()
    {
        if (!imagesShouldScroll)
            return;
        UIView.BeginAnimations("ScrollLeft");
        UIView.SetAnimationCurve(UIViewAnimationCurve.Linear);
        UIView.SetAnimationDuration(test.Count * 10);
        scrlImages.ContentOffset = new PointF(0, 0);
        UIView.SetAnimationDelegate(this);
        UIView.SetAnimationDidStopSelector(new Selector("ScrollToRight"));
        UIView.CommitAnimations();
    }

这非常适合在UIScrollView中来回滚动。 我需要做的是让用户通过在ScrollView上滑动来中断动画,因为它们通常会滚动列表。所以我将一个监听器附加到ScrollView,如下所示:

        scrlImages.DraggingStarted += (sender, e) => 
        {
           if (imagesShouldScroll)
           {
               scrlImages.Layer.RemoveAllAnimations();
               imagesShouldScroll = false;
           }
        };

这可以按预期停止动画。问题是ContentOffset已经设置为繁忙动画的边缘。因此,当用户滑动ScrollView时,它会突然跳转到列表的末尾。我希望用户能够停止动画,并手动接管滚动。我认为应该有一种方法可以使用动画的开始时间和当前图形时间来确定动画运行的时间,以确定当时ContentOffset的位置,然后跳回那里。这对我来说听起来很不好,不太理想。

注意:我知道我可以在UIViewAnimationOptions.Autoreverse中使用UIView.Animate,当时我当时并不知道。我也能够使用计时器来定期设置ContentOffset来实现我想要的行为。虽然它受CPU限制,所以它不是很顺利。

1 个答案:

答案 0 :(得分:0)

在从滚动视图的图层中删除所有动画之前,请先从其bounds.origin中读取presentationLayer,然后将其设置为contentOffset