当我尝试向左/右滑动时,我的应用内容也会垂直滚动以创建凌乱的用户体验。有没有办法阻止它?如何防止左右滑动时出现垂直滚动
这是我如何处理刷卡
// angular directive
link: function(scope, element, attrs) {
$ionicGesture.on('swiperight', function(){console.log("swiped");}, element);
}
当我尝试向左/右滑动时,我的应用内容也会垂直滚动以创建凌乱的用户体验。有没有办法阻止它?如何防止左右滑动时出现垂直滚动
这是我如何处理刷卡
// angular directive
link: function(scope, element, attrs) {
$ionicGesture.on('swiperight', function(){console.log("swiped");}, element);
}
前言:在确保与ios和android环境兼容后,此解决方案完全改写;下面的评论可能不再适用;欢迎任何反馈。
YES,有防止当你水平滑动滚动的应用程序内容的方式:由angularjs tapDetector
指令与离子$ionicScrollDelegate
服务相结合。
我们还需要使用非常快的DOM事件检测,检测刷卡(mousedown
/touchstart
,mousemove
/touchmove
,mouseup
/touchend
); 这是必要的,因为$ionicGesture
事件监听器在滚动完成后检测到滑动:检测在离子中滑动是否会减慢我们的目的。
的tapDetector
指令放在身体像这样:
<body ng-controller="MyCtrl" tap-detector>
这里是指令代码:
.directive('tapDetector',function($ionicGesture,$ionicScrollDelegate){
return{
restrict:'EA',
link:function(scope,element){
var startX,startY,isDown=false;
element.bind("mousedown touchstart", function(e){
e=(e.touches)?e.touches[0]:e;//e.touches[0] is for ios
startX = e.clientX;
startY = e.clientY;
isDown=true;
//console.log("mousedown",startX,startY);
});
element.bind("mousemove touchmove", function(e){
e=(e.touches)?e.touches[0]:e;//e.touches[0] is for ios
if(isDown){
var deltaX = Math.abs(e.clientX - startX);
var deltaY = Math.abs(e.clientY - startY);
if(deltaX > deltaY) {
//console.log("horizontal move");
$ionicScrollDelegate.$getByHandle('mainScroll').freezeScroll(true);
}
}
});
element.bind("mouseup touchend", function(e){
isDown=false;
$ionicScrollDelegate.$getByHandle('mainScroll').freezeScroll(false);
//console.log("mouseup touchend");
});
}
}
})
当你触摸屏幕(准备对于滑动),设置触摸坐标(startX,startY)并将isDown
设置为true。
当您开始滑动时,我们需要确定滑动是水平还是垂直。我们只在水平刷卡感兴趣:
var deltaX = Math.abs(e.clientX - startX);
var deltaY = Math.abs(e.clientY - startY);
deltaX
是原来的X和当前的X之间的差值(DELTA); deltaY
是原始Y与当前Y之间的差异(增量)
if (deltaX > deltaY)
我们得到了一个水平滑动!
现在已检测到足够快的刷卡,所有剩下来的事情就是动态地防止滚动:
$ionicScrollDelegate.$getByHandle('mainScroll').freezeScroll(true);
,并在HTML:<ion-content delegate-handle="mainScroll">
滚动后完成后,我们必须解冻(解冻?)滚动:
element.bind("mouseup touchend", function(e){
isDown=false;
$ionicScrollDelegate.$getByHandle('mainScroll').freezeScroll(false);
});
这是与iPad 2 和Android的Galaxy S4测试
差点忘了:这里是SMR的working pen(礼节)
@sMr自从你打开赏金以后,请检查这个并告诉我它是否有效,这样我就可以接受答案。 – Anri 2015-04-01 19:23:37
@Anri我试过了答案,但是它在挥动的时候会使内容飞溅......所以让我们等待另一个答案,直到最后一天的赏金 – semirturgay 2015-04-03 12:27:40
@sMr是的,在恢复正常的滚动行为之前,我放置了3秒的任意延迟;尽管如此,它可以按照你的意愿缩短。请说明您期望的确切行为:现在触发滑动后,可以防止垂直滚动:是不是需要? – Manube 2015-04-03 12:32:24
目前还没有从离子球队API来做到这一点,但我临时做了一个猴子补丁和功能要求。 https://github.com/driftyco/ionic/issues/2703
请重新回答,并提供反馈时,能够... – Manube 2015-04-06 17:41:52
@Manube对不起,我没有办法/时间再检查这一点,我甚至不使用离子现在,让社区处理它,有不少感兴趣的人。 – Anri 2015-04-06 21:24:59
好的,没问题,谢谢你的回复 – Manube 2015-04-07 04:37:49