我正在尝试为 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 限制,所以它不是很流畅。