有人知道如何阻止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水平反弹?


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

注意:从技术上讲,这是使用私有API,因此你的应用程序可能会在未来的操作系统版本中被拒绝或崩溃。使用@try和respondsToSelector


查看UIScrollView的bounces属性。苹果文档中写道:

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

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


我曾关注过一个名为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];
}

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


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


这里有两个新的潜在解决方案。显然,你可以使用jqtouch或pastrykit禁用滚动。然而,我没有这些工作。你可能会更有能力。

关闭垂直滚动

深入到pastrykit


移动safari上的固定定位

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


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


在我看来UIWebView有一个UIScrollView。你可以使用有文档的api来实现这一点,但是反弹是针对两个方向设置的,而不是单独设置的。这在API文档中。 UIScrollView有一个bounce属性,所以像这样工作(不知道是否有多个scrollview):

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不是一个滚动视图,所以我做了一个自定义子类来获得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.


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;

WKWebView也是一样。


我所做的就是:

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应用。


我尝试了一种稍微不同的方法来防止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提交任何应用程序。但我相信到目前为止我还没有使用任何无证件的东西……如果有人有其他发现,请通知我。


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

[ObjWebview setUserInteractionEnabled:FALSE];

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


在iOS5上,只有当你计划让用户缩放webview内容(我:双击),反弹设置是不够的。你还需要设置alwaysBounceHorizontal和alwaysBounceVertical属性为NO,否则当它们缩小时(另一个双击…)默认它将再次反弹。


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

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

myWebView.scrollView.bounces = NO;

请参阅UIWebView类参考。

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


在寻找答案的过程中偶然发现了这个,我最终只是在瞎折腾的过程中幸运地找到了自己的答案。我所做的

[[webview scrollView] setBounces:NO];

这招奏效了。


webView.scrollView.scrollEnabled =没有; webView.scrollView.bounces =没有;


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

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

or

[[webView scrollView] setScrollEnabled:NO];

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


在Swift中禁用反弹

webViewObj.scrollView.bounces = false

斯威夫特3

webView.scrollView.bounces = false