2014-12-07 101 views
5

当我尝试向左/右滑动时,我的应用内容也会垂直滚动以创建凌乱的用户体验。有没有办法阻止它?如何防止左右滑动时出现垂直滚动

这是我如何处理刷卡

// angular directive 
link: function(scope, element, attrs) { 
     $ionicGesture.on('swiperight', function(){console.log("swiped");}, element); 
} 
+0

请重新回答,并提供反馈时,能够... – Manube 2015-04-06 17:41:52

+0

@Manube对不起,我没有办法/时间再检查这一点,我甚至不使用离子现在,让社区处理它,有不少感兴趣的人。 – Anri 2015-04-06 21:24:59

+0

好的,没问题,谢谢你的回复 – Manube 2015-04-07 04:37:49

回答

4

前言:在确保与ios和android环境兼容后,此解决方案完全改写;下面的评论可能不再适用;欢迎任何反馈。


YES,有防止当你水平滑动滚动的应用程序内容的方式:由angularjs tapDetector指令与离子$ionicScrollDelegate服务相结合。

我们还需要使用非常快的DOM事件检测,检测刷卡(mousedown/touchstartmousemove/touchmovemouseup/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(礼节)

+0

@sMr自从你打开赏金以后,请检查这个并告诉我它是否有效,这样我就可以接受答案。 – Anri 2015-04-01 19:23:37

+0

@Anri我试过了答案,但是它在挥动的时候会使内容飞溅......所以让我们等待另一个答案,直到最后一天的赏金 – semirturgay 2015-04-03 12:27:40

+0

@sMr是的,在恢复正常的滚动行为之前,我放置了3秒的任意延迟;尽管如此,它可以按照你的意愿缩短。请说明您期望的确切行为:现在触发滑动后,可以防止垂直滚动:是不是需要? – Manube 2015-04-03 12:32:24