在iOS中从左到右滚动时如何在Web视图中获取滚动方向?

Posted

技术标签:

【中文标题】在iOS中从左到右滚动时如何在Web视图中获取滚动方向?【英文标题】:How to get the scroll direction in web view when scrolling left to right in iOS? 【发布时间】: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];
            

【问题讨论】:

【参考方案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 以外的其他值。

【讨论】:

带有panGestureRecognizer依赖于ios 5+的免责声明【参考方案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。

【讨论】:

以上是关于在iOS中从左到右滚动时如何在Web视图中获取滚动方向?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 iPhone 应用程序中从左到右移动文本? [关闭]

当滚动方向为水平时,从左到右填充 UICollectionView

html语言中从左到右的滚动代码是啥求指教

如何在滚动时从左到右移动 div?

如何在 iOS 中制作可滚动视图?

我可以在 tableviewcell 中发现 tableview 手势识别器的状态吗