我使用Ember-Gestures在Cordova应用中实现Hammer.js来实现一些简单的手势控制。
我遇到一个主要问题,即触发动画的任何手势(过渡,变换,SVG动画),如果屏幕滚动任何数量,该动画将冻结并在滚动时处于结束状态完成。特别是,我在一个可垂直滚动的页面上有一个元素,应该(理想情况下)能够被挤入和拉出以将其扩展为多个元素或重新组合成一个元素。
我很熟悉,因为优化iOS会在滚动期间冻结所有动画。但是,由于捏合和滑动手势都可以轻微滚动屏幕,这对于用户体验来说非常糟糕,因为如果用户滑动(例如,略微向上和向左而不是直接向左),则可以完全冻结精细的过渡。
我尝试了一些解决方案,以便像here那样在滚动期间启用渲染,但这些似乎不适用于当代版本的iOS。我还尝试使用hammerJS e.preventDefault()方法在通过Ember-gestures扩展调用的手势期间冻结滚动,所以我的方法看起来像:
swipeLeft(e) {
e.originalEvent.gesture.srcEvent.preventDefault()
// Do stuff
},
......但这并没有任何明显的效果。 (也许这里出了点问题?gesture
本身没有preventDefault()
方法,而且余烬手势似乎试图将其中的一部分抽象出来。
有没有什么方法可以让我在滚动过程中保持动画渲染(这似乎不太可能),或者在执行动画之前将页面向右滚动停止(并防止在执行动画时滚动)?
或者,有什么方法可以添加约束到被解释为"捏"或者"刷卡"手势使得那些也被解释为滚动手势的手势被排除在外。
答案 0 :(得分:0)
我的解决方案最终是添加事件处理程序,以便在用多个手指触摸屏幕时,将主体设置为固定位置,使其在触摸持续时间内不可滚动(触摸时移除固定位置)结束)。我将处理程序添加到pinchStart
和pinchEnd
事件
我怀疑可能有一个更优雅的解决方案,但是为了在捏合时禁用意外滚动以便D3.js动画不会在中途冻结,这是一个快速有效的修复。