在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 应用程序中从左到右移动文本? [关闭]