0

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 バウンドであるため、あまりスムーズではありません。

4

1 に答える 1