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