【问题标题】:How to get the scroll direction in web view when scrolling left to right in iOS?在iOS中从左到右滚动时如何在Web视图中获取滚动方向?
【发布时间】:2013-05-29 08:43:17
【问题描述】:

我有一个应用程序,其中有一个加载 HTML 页面的 web 视图。我正在加载的 html 页面包含 5 个页面。实际上,当我滚动 webview 时,我的 webview 的 scrollViewDidScroll: 委托方法被调用,我正在检查偏移量以获取 webview 滚动的方向。

当我向右滚动 web 视图时,我得到的内容偏移量为 2,它移动到 html 的下一页。当我再次向右滚动 webview 时,它会将内容偏移量显示为 0 并移至上一页。

当方向是右/左时,我想在 webview 上调用 JavaScript 方法。

这是我的代码:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"self.webview.scrollView.contentOffset.x:%f",self.webview.scrollView.contentOffset.x);

    NSLog(@"%d",lastContentOffset);
    NSString *val =  @"getPageNo()";
    NSString *val1=  [webview stringByEvaluatingJavaScriptFromString:val];
    int pageno = [val1 intValue];
    NSLog(@"%@",val1);        

    if ( self.webview.scrollView.contentOffset.x==0)
    {       
        //this means webview moves in left direction
        NSLog(@"%f",self.webview.scrollView.contentOffset.x);
        NSLog(@"%d",lastContentOffset);
        NSString *showpageno = [NSString stringWithFormat:@"showPage('%d')",pageno-1];
        [webview stringByEvaluatingJavaScriptFromString:showpageno];
    }
    else if ( self.webview.scrollView.contentOffset.x>0)
    {
        //this means webview moves in right direction
        NSLog(@"%f",self.webview.scrollView.contentOffset.x);
        NSLog(@"%d",lastContentOffset);
        NSString *showpageno = [NSString stringWithFormat:@"showPage('%d')",pageno+1];
        [webview stringByEvaluatingJavaScriptFromString:showpageno];
    }        
}

【问题讨论】:

    标签: iphone objective-c webview


    【解决方案1】:

    只需在 scrollViewDidScroll 中使用以下内容即可检测左/右平移。

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGPoint velocity = [[scrollView panGestureRecognizer]velocityInView:scrollView.superview];
        if (velocity.x == 0) {
            return;
        }
        if (velocity.x < -1) {
            // Scrolling left
        } else if (velocity.x > 1) {
            // Scrolling Right 
        }
    }
    

    如果您想要更大的灵活性,您可以使用 1 和 -1 以外的其他值。

    【讨论】:

    【解决方案2】:

    继承 UIWebView 并重写“didPan”方法以获取平移手势的速度。

    例如:

     - (void)didPan:(UIGestureRecognizer *)gesture
       {
            UIPanGestureRecognizer *pan=(UIPanGestureRecognizer *)gesture;
    
            CGPoint vel = [pan velocityInView:self.view];
    
            if (vel.x > 0)
            {
                // user dragged towards the right
            }
            else
            {
                // user dragged towards the left
            }
        }
    

    现在您可以使用 didPan 方法中的一些委托机制来让目标类了解滚动方向。

    【讨论】:

      【解决方案3】:

      免责声明:您没有指定需要支持的最低操作系统。我通常至少仍然支持 iOS 4.3,所以对于我的应用程序,the panGestureRecognizer property 不可用。

      在您的滚动视图委托中,一个枚举:

      typedef enum {
          NONE,
          RIGHT,
          LEFT,
          UP,
          DOWN
      } ScrollDirection;
      

      变量:

      float lastContentOffset;
      ScrollDirection scrollDirection;
      

      然后

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView
      {
          static int pageNumber = 0;
          static BOOL firstRun = YES;
      
          if (lastContentOffset > scrollView.contentOffset.x) {
              scrollDirection = RIGHT;
          } else if (lastContentOffset < scrollView.contentOffset.x) {
              scrollDirection = LEFT;
          }
          lastContentOffset = scrollView.contentOffset.x;
          if (!firstRun) {
              int pageIndex = [self currentScrollPage];
              if (pageIndex != pageNumber) {
                  // we've changed pages!
                  pageNumber = pageIndex;
      
                  // defer execution to keep scrolling responsive, if 
                  //   handlePageChange represents any significant work
                  [self performSelector: @selector(handlePageChange) withObject: nil afterDelay:0];
              }
          }
          firstRun = NO;
      }
      
      - (void) handlePageChange {
      }
      
      -(int)currentScrollPage {
          // NOTE: there's a number of ways to calculate this, that affect
          //  precisely WHEN your delegate triggers the page change handler.
          //  This may not affect you, but could, if scrolling performance is
          //  an issue.
      
          if (scrollDirection == RIGHT) {
              // round up to delay changeover of pages
              return ceil(fabs(self.scrollView.contentOffset.x) / self.scrollView.frame.size.width);
          } else /* if (scrollDirection == LEFT) */ {
              // round down to delay changeover of pages
              return fabs(self.scrollView.contentOffset.x) / self.scrollView.frame.size.width;
          }
      }
      

      注意:您的滚动视图委托可能会在滚动期间被多次回调,因此通常,我会跟踪页面实际更改的时间,并且仅在发生这种情况时才执行工作……而不是在每一个小的滚动增量时。这就是为什么我有handlePageChange 方法。如果您的 javascript 调用取决于方向,您可以在该方法中检查 scrollDirection

      我不知道它是否会影响您的特定问题,但here's an answer I posted concerning performance in your scroll view delegate

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        相关资源
        最近更新 更多