有人知道如何阻止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];
}

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

其他回答

我曾关注过一个名为QuickConnect的项目,该项目可以将web应用程序轻松地创建为iPhone上成熟的可安装应用程序,并找到了一个可行的解决方案,如果你不想让你的屏幕完全可滚动的话,而在我的情况下,我不想让屏幕可滚动。

在上面提到的项目/博客文章中,他们提到了一个javascript函数,你可以添加它来关闭反弹,本质上可以归结为:

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

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

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

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

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

这为我工作,而且很漂亮(我使用phonegap与webView)

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

or

[[webView scrollView] setScrollEnabled:NO];

下面是一个使用scrollview setBounces函数的通用应用程序示例。这是一个开源项目/示例,位于这里:链接到SimpleWebView(项目Zip和源代码示例)

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

看起来,UIWebView或它的scroller子视图使用它自己的平移手势识别器来检测用户滚动。但根据苹果的文档,有一种合法的方法可以覆盖一个手势识别器。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;                                                                                                                                        
}              

当然,这个委托方法在实际应用中可能会更复杂——我们可以选择性地禁用其他识别器,分析otherGestureRecognizer。视图,并根据它是什么视图做出决策。

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

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

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

到目前为止,我只是在尝试所有这些东西,它似乎或多或少地像我想要的那样工作。不过,我还没有尝试向iStore提交任何应用程序。但我相信到目前为止我还没有使用任何无证件的东西……如果有人有其他发现,请通知我。