停止UIWebView从“反弹”垂直?

有谁知道如何停止从垂直弹跳UIWebView? 我的意思是当用户触摸他们的iphone屏幕,向下拖动他们的手指,webview显示在我已经加载的网页上方的空白处?

我已经看过以下可能的解决scheme,但是他们都没有为我工作:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html

http://forums.macrumors.com/showthread.php?t=619534

如何阻止UIScrollView水平弹跳?

for (id subview in webView.subviews) if ([[subview class] isSubclassOfClass: [UIScrollView class]]) ((UIScrollView *)subview).bounces = NO; 

…似乎工作正常。

它也会被App Store所接受。

更新 :在iOS 5.x +有一个更简单的方法 – UIWebView具有scrollView属性,所以你的代码可以像这样:

 webView.scrollView.bounces = NO; 

我正在寻找一个项目,可以很容易地创buildWeb应用程序作为iPhone上完全成熟的可安装应用程序QuickConnect ,并find了一个解决scheme,如果你不希望你的屏幕是可滚动的,在我的情况我没有。

在上面提到的项目/博客文章中,他们提到了一个JavaScript函数,您可以添加closures弹跳,基本归结为:

  document.ontouchmove = function(event){ event.preventDefault(); } 

如果你想了解更多关于他们如何实现它,只需下载QuickConnect,并检查出来….但基本上所有它所做的就是调用页面加载的JavaScript …我试着把它放在我的文档的头,它似乎工作正常。

那么我所做的就是:

 UIView *firstView = [webView.subviews firstObject]; if ([firstView isKindOfClass:[UIScrollView class]]) { UIScrollView *scroll = (UIScrollView*)firstView; [scroll setScrollEnabled:NO]; //to stop scrolling completely [scroll setBounces:NO]; //to stop bouncing } 

对我来说工作得很好…另外,这个问题的答案是苹果将拒绝,如果你在你的iPhone应用程序中使用它。

在iOS 5 SDK中,您可以直接访问与Web视图关联的滚动视图,而不是迭代其子视图。

因此,要禁用滚动视图中的“弹跳”,您可以使用:

 myWebView.scrollView.bounces = NO; 

请参阅UIWebView类参考 。

(但是,如果您需要在5.0之前支持SDK的版本,则应遵循Mirek Rusin的build议 。)

警告。 我使用了setAllowsRubberBanding:在我的应用程序中,Apple拒绝了它,声明不允许使用非公共API函数(引用:3.3.1)

Swift 3

 webView.scrollView.bounces = false 

在Swift中禁用反弹

 webViewObj.scrollView.bounces = false 

布拉德的方法为我工作。 如果你使用它,你可能想要使它更安全一些。

  id scrollView = [yourWebView.subviews objectAtIndex:0];
如果([scrollView respondsToSelector:@selector(setAllowsRubberBanding :)])
 {
     [scrollView performSelector:@selector(setAllowsRubberBanding :) withObject:NO];
 }

如果苹果改变了一些东西,那么反弹会回来 – 但至less你的应用程序不会崩溃。

在iOS5上,只有当您计划让用户放大webview内容(ei:双击)时,反弹设置是不够的。 你需要设置alwaysBounceHorizo​​ntal和alwaysBounceVertical属性为NO,否则当他们缩小(另一个双击…)默认情况下,它会再次反弹。

我遍历了UIWebView的子视图集合,并将其背景设置为[UIColor blackColor],与网页背景颜色相同。 视图仍然会反弹,但不会显示丑陋的深灰色背景。

我恼火地发现,UIWebView不是一个滚动视图,所以我做了一个自定义的子类来获取在Web视图的滚动视图。 这个suclass包含一个滚动视图,所以你可以自定义你的web视图的行为。 这堂课的重点是:

 @class CustomWebView : UIWebview ... - (id) initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; // WebViews are subclass of NSObject and not UIScrollView and therefore don't allow customization. // However, a UIWebView is a UIScrollViewDelegate, so it must CONTAIN a ScrollView somewhere. // To use a web view like a scroll view, let's traverse the view hierarchy to find the scroll view inside the web view. for (UIView* v in self.subviews){ if ([v isKindOfClass:[UIScrollView class]]){ _scrollView = (UIScrollView*)v; break; } } return self; 

}

然后,当您创build自定义网页视图时,您可以禁用弹跳:

 customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO) 

这是一个伟大的通用目的的方式来使网页视图与可定制的滚动行为。 有几件事值得注意:

  • 与任何视图一样,您还需要重写 – (id)initWithCoder:如果您在Interface Builder中使用它
  • 当您最初创buildWeb视图时,其内容大小始终与视图框架的大小相同。 在滚动网页后,内容大小代表视图内实际网页内容的大小。 为了解决这个问题,我做了一些hacky – 调用-setContentOffset:CGPointMake(0,1)animation:YES强制一个不明显的变化,它将设置Web视图的正确内容大小。

遇到这个寻找答案,我最终只是幸运地回答了我自己的答案。 我做了

 [[webview scrollView] setBounces:NO]; 

它的工作。

这工作对我来说,也很漂亮(我使用webView的phonegap)

 [[webView.webView scrollView] setScrollEnabled:NO]; 

要么

 [[webView scrollView] setScrollEnabled:NO]; 

它看起来像UIWebView有一个UIScrollView。 你可以使用logging的API来实现这个function,但是为两个方向而不是单独设置弹跳。 这是在API文档中。 UIScrollView有一个反弹属性,所以这样的工作(不知道是否有多个滚动视图):

 NSArray *subviews = myWebView.subviews; NSObject *obj = nil; int i = 0; for (; i < subviews.count ; i++) { obj = [subviews objectAtIndex:i]; if([[obj class] isSubclassOfClass:[UIScrollView class]] == YES) { ((UIScrollView*)obj).bounces = NO; } } 

我尝试了一个稍微不同的方法来防止UIWebView对象滚动和弹跳:添加手势识别器来覆盖其他手势。

看来, UIWebView或其滚动子视图使用自己的平移手势识别器来检测用户滚动。 但根据苹果公司的文件,有一种合法的方式是将一个手势识别器与另一个手势识别器重写。 UIGestureRecognizerDelegate协议有一个方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: – 它允许控制任何碰撞手势识别器的行为。

所以,我做的是

在视图控制器的viewDidLoad方法中:

 // Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures // by registering this object as the recognizer's delegate UIPanGestureRecognizer *recognizer; recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; recognizer.delegate = self; recognizer.maximumNumberOfTouches = 1; [self.view addGestureRecognizer:recognizer]; self.panGestureFixer = recognizer; [recognizer release]; 

那么,手势重写方法:

 // Control gestures precedence - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in // the most painless way) if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { // Just disable every other pan gesture recognizer right away otherGestureRecognizer.enabled = FALSE; } return NO; } 

当然,这种委托方法在实际应用中可能更加复杂 – 我们可能会有select地禁用其他识别器,分析其他的GlanceRecognizer.view ,并根据它是什么样的观点作出决定。

最后,为了完整起见,我们注册为泛处理程序的方法:

 - (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer { // do nothing as of yet } 

它可以是空的,如果我们想要的是取消networking视图的滚动和反弹,或者它可以包含我们自己的代码来实现我们真正想要的那种平移animation和animation…

到目前为止,我只是试验所有这些东西,而且似乎正在或多或less的工作,因为我想要它。 尽pipe如此,我还没有尝试将任何应用程序提交给iStore。 但是我相信我迄今还没有使用过任何没有logging的东西…如果有人发现它,请告诉我。

这里有两个较新的潜在解决scheme。 显然,你可以使用jqtouch或pastrykit禁用滚动。 但是,我没有得到这些工作。 你可能更有能力。

closures垂直滚动

挖入糕点套餐

固定在移动Safari上的定位

这个链接帮了我很多…..简单..有一个演示..

(Xcode 5 iOS 7 SDK示例)以下是使用滚动视图setBounces函数的通用应用程序示例。 这是一个开源项目/例子在这里: 链接到SimpleWebView(项目邮编和源代码示例)

UIWebView的子视图之一应该是一个UIScrollView 。 将其scrollEnabled属性设置为NO ,Web视图将完全禁用滚动。

注意:这在技术上使用私人API,因此您的应用程序可能会在未来的操作系统版本中被拒绝或崩溃。 使用@tryrespondsToSelector

看看UIScrollViewbounces属性。 苹果公司的文档:

如果该属性的值为YES (默认值),则滚动视图在遇到内容的边界时会popup。 从视觉上反弹表明滚动已达到内容的边缘。 如果该值为“ NO ,则滚动立即在内容边界处停止而不弹跳。

确保你使用的是正确的UIScrollView 。 我不确定UIWebView的层次结构是什么样子,但滚动视图可以是UIWebView的父级而不是子级。

要禁用UIWebView滚动,您可以使用以下代码行:

 [ObjWebview setUserInteractionEnabled:FALSE]; 

在这个例子中, ObjWebview的types是UIWebView

webView.scrollView.scrollEnabled = NO; webView.scrollView.bounces = NO;