2

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

当我向右滚动 webview 时,我得到内容偏移量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];
    }        
}
4

3 回答 3

2

只需在 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 以外的其他值。

于 2013-05-29T09:17:57.547 回答
0

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

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

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方法。scrollDirection如果您的 javascript 调用取决于方向,您可以在该方法内部进行检查。

我不知道它是否会影响您的特定问题,但这是我在您的滚动视图委托中发布的有关性能的答案

于 2013-05-29T09:00:04.270 回答
0

继承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方法中的一些委托机制来让目标类了解滚动方向。

于 2013-05-29T08:56:02.437 回答