有人知道如何阻止UIWebView垂直反弹吗?我的意思是,当用户触摸他们的iphone屏幕,向下拖动他们的手指时,web视图在我加载的网页上方显示一个空白点?

我研究了以下可能的解决方案,但没有一个适合我:

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

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

我如何停止一个UIScrollView水平反弹?


当前回答

布拉德的方法对我很管用。如果你使用它,你可能想让它更安全一点。

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

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

其他回答

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

[ObjWebview setUserInteractionEnabled:FALSE];

在这个例子中,ObjWebview的类型是UIWebView。

移动safari上的固定定位

这个链接帮助我很多.....很简单. .有一个演示。

在iOS 5 SDK中,你可以直接访问与web视图相关的滚动视图,而不是遍历它的子视图。

所以要禁用滚动视图中的“反弹”,你可以使用:

myWebView.scrollView.bounces = NO;

请参阅UIWebView类参考。

(但是如果你需要支持5.0之前的SDK版本,你应该听从Mirek Rusin的建议。)

布拉德的方法对我很管用。如果你使用它,你可能想让它更安全一点。

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

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

我很恼火地发现UIWebView不是一个滚动视图,所以我做了一个自定义子类来获得web视图的滚动视图。这个子类包含一个滚动视图,所以你可以自定义你的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;

}

然后,当你创建一个自定义web视图时,你可以禁用反弹:

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

这是一个伟大的通用方法,使web视图具有自定义滚动行为。这里有几件事需要注意:

as with any view, you'll also need to override -(id)initWithCoder: if you use it in Interface Builder when you initially create a web view, its content size is always the same as the size of the view's frame. After you scroll the web, the content size represents the size of the actual web contents inside the view. To get around this, I did something hacky - calling -setContentOffset:CGPointMake(0,1)animated:YES to force an unnoticeable change that will set the proper content size of the web view.