【问题标题】:Autoscroll UIScrollView, allow user to interrupt animation自动滚动 UIScrollView,允许用户中断动画
【发布时间】:2013-10-11 14:26:46
【问题描述】:

我正在尝试为 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 的位置,然后跳回到那里。不过,这对我来说听起来很老套,不太理想。

注意:我知道我可以将 UIView.Animate 与 UIViewAnimationOptions.Autoreverse 一起使用,但当时我并不知道。我还能够使用计时器定期设置 ContentOffset 来实现我想要的行为。不过它受 CPU 限制,所以不是很流畅。

【问题讨论】:

    标签: iphone ios animation uiscrollview xamarin.ios


    【解决方案1】:

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

    【讨论】:

    • 像魅力一样工作!我可能应该在 API 中挖掘更多。感谢您的帮助。
    • 不客气。除非您已经知道要查找的内容,否则通常很难知道去哪里寻找!
    猜你喜欢
    • 2011-08-14
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2012-07-15
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多