首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UIScrollViewDelegate - animateWithDuration in scrollViewDidEndDragging不像预期的那样工作

UIScrollViewDelegate - animateWithDuration in scrollViewDidEndDragging不像预期的那样工作
EN

Stack Overflow用户
提问于 2015-10-02 09:34:17
回答 1查看 878关注 0票数 2

我有一个具有两个子视图/页面并排的UIScrollView (水平内容大小=2*屏幕宽度+页面之间的沟槽空间)。我想提高动画的完成速度(在用户完成拖动和举起手指之后)。基于SO中的建议,我实现了一个UIScrollViewDelegate,如下所示。

代码语言:javascript
运行
复制
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)中遇到了另一个问题,描述了这个问题和可能的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-02 13:01:24

问题似乎是因为弹跳动画和定制动画的排队。详情请阅读- Cancel UIScrollView bounce after dragging.我不知道选择的答案如何解决自定义持续时间的问题。还有另一种解决方案涉及子类。在我的案子里也不管用。不确定这是否是由于不同的iOS版本。

以下是对我有用的东西。它只是基本的片段。您可以增强相同的动画曲线和速度处理更好。

代码语言:javascript
运行
复制
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) })
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32904369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档