我有一个具有两个子视图/页面并排的UIScrollView (水平内容大小=2*屏幕宽度+页面之间的沟槽空间)。我想提高动画的完成速度(在用户完成拖动和举起手指之后)。基于SO中的建议,我实现了一个UIScrollViewDelegate,如下所示。
class MyScrollViewDelegate: NSObject, UIScrollViewDelegate
{
var targetX: CGFloat = 0.0
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
// I have not implemented the paging logic yet as I wanted to test the replacement animation first.
// Below code simply uses the suggested tagetOffset, but limiting the same between the valid min and max values
targetX = fmax(0, fmin(scrollView.contentSize.width - scrollView.frame.size.width, targetContentOffset.memory.x))
}
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool)
{
UIView.animateWithDuration(0.25, animations: { scrollView.contentOffset = CGPointMake(self.targetX, 0) })
}
}我的理解是,一旦拖拽结束,我自己在scrollViewDidEndDragging中的动画代码将接管并完成翻译。我面临的问题是,当我将视图拉向内时,当它位于最左边或最右边的边缘时,似乎会有一个额外的动画/跳跃。
例如,当contentOffset.x = 0 (左边沿),如果我将视图向右拉20分并释放(甚至在暂停一秒钟之后),contentOffset.x & the tContentOffset.Memy.x将为- 20,计算出的self.targetX将为0。因此,在我的动画中,我期望页面以给定的速度向左移动20分,只要我举起手指。但我所观察到的是,页面向右的距离几乎是一样的(拖动距离),然后从那里恢复到0。动作太快了,我看不出是动画还是直接跳。之后,它会跟随我的动画参数返回。
如前所述,右边的跳跃似乎与拖曳距离成正比,这表明我对动画开始前的“当前位置”的假设可能是错误的。但我无法找出确切的原因。非常感谢你的帮助。安装程序是IOS9.0,Quick2.0,xcode 7.0.1。
编辑1:
我评论了animateWithDuration (但保留了scrollViewDidEndDragging)。动画停止,除非在边缘区域,在那里有一个默认的动画拉回内容。进一步阅读指向bounce属性。我怀疑这个默认动画是否与我提供的动画发生了冲突。
编辑2:
bounce动画似乎是罪魁祸首。在朝这个方向搜索时,我在SO (Cancel UIScrollView bounce after dragging)中遇到了另一个问题,描述了这个问题和可能的解决方案。
发布于 2015-10-02 13:01:24
问题似乎是因为弹跳动画和定制动画的排队。详情请阅读- Cancel UIScrollView bounce after dragging.我不知道选择的答案如何解决自定义持续时间的问题。还有另一种解决方案涉及子类。在我的案子里也不管用。不确定这是否是由于不同的iOS版本。
以下是对我有用的东西。它只是基本的片段。您可以增强相同的动画曲线和速度处理更好。
func scrollViewWillBeginDecelerating(scrollView: UIScrollView)
{
// below line seems to prevent the insertion of bounce animation
scrollView.setContentOffset(scrollView.contentOffset, animated: false)
// provide your animation with custom options
UIView.animateWithDuration(0.25, animations: { scrollView.contentOffset = CGPointMake(targetX, targetY) })
}https://stackoverflow.com/questions/32904369
复制相似问题