229

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

我查看了以下可能的解决方案,但没有一个对我有用:

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

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

如何阻止 UIScrollView 水平弹跳?

4

22 回答 22

429
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

于 2010-07-24T11:22:43.423 回答
46

我正在研究一个项目,该项目可以轻松地将 Web 应用程序创建为 iPhone 上的完整可安装应用程序QuickConnect,并找到了一个可行的解决方案,如果您根本不希望屏幕可滚动,在我的情况下我没有。

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

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

如果您想了解更多关于他们如何实现它的信息,只需下载 QuickConnect 并查看它......但基本上它所做的只是在页面加载时调用那个 javascript......我试着把它放在我的文档的头部,它似乎工作正常。

于 2009-02-09T02:11:44.080 回答
18

好吧,我所做的就是:

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 应用程序中使用它,Apple 会拒绝这个问题的答案。

于 2010-08-22T15:39:23.220 回答
17

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

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

myWebView.scrollView.bounces = NO;

请参阅UIWebView 类参考

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

于 2011-12-29T00:28:01.813 回答
12

斯威夫特 3

webView.scrollView.bounces = false
于 2016-11-16T06:58:36.037 回答
9

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

于 2009-11-16T17:29:31.570 回答
4

在 Swift 中禁用反弹

webViewObj.scrollView.bounces = false
于 2016-09-01T10:13:13.990 回答
3

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

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

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

于 2009-07-18T15:21:32.130 回答
3

在 iOS5 上,仅当您计划让用户缩放 web 视图内容(ei:双击)时,反弹设置是不够的。您还需要将 alwaysBounceHorizo​​ntal 和 alwaysBounceVertical 属性设置为 NO,否则当它们缩小(另一个双击...)默认设置时,它会再次反弹。

于 2011-10-12T08:05:09.010 回答
2

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

于 2010-03-02T09:51:13.977 回答
2

在我看来,UIWebView 有一个 UIScrollView。您可以为此使用记录在案的 API,但弹跳是为两个方向设置的,而不是单独设置的。这是在 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;
    }
}
于 2010-06-03T08:05:36.947 回答
2

我很生气地发现 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 视图的一种很好的通用方法。有几点需要注意:

  • 与任何视图一样,您还需要覆盖 -(id)initWithCoder: 如果您在 Interface Builder 中使用它
  • 当您最初创建 Web 视图时,其内容大小始终与视图框架的大小相同。滚动网页后,内容大小表示视图内实际网页内容的大小。为了解决这个问题,我做了一些 hacky - 调用 -setContentOffset:CGPointMake(0,1)animated:YES 来强制进行不明显的更改,以设置 Web 视图的正确内容大小。
于 2010-06-08T20:55:54.357 回答
2

遇到了这个寻找答案的问题,我最终只是通过搞砸自己的答案而幸运。我做了

[[webview scrollView] setBounces:NO];

它奏效了。

于 2012-01-20T13:57:30.290 回答
2

这对我有用,而且也很漂亮(我正在使用带有 webView 的 phonegap)

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

或者

[[webView scrollView] setScrollEnabled:NO];
于 2013-08-21T19:02:14.987 回答
1

这是两个较新的潜在解决方案。显然,您可以使用 jqtouch 或 Pastrykit 来禁用滚动。但是,我还没有让这些工作。你可能更有能力。

关闭垂直滚动

挖掘糕点包

于 2009-12-16T14:17:00.817 回答
1

移动 Safari 上的固定定位

这个链接帮助了我很多.....它很容易..有一个演示..

于 2010-01-22T14:01:51.327 回答
1

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

看来,UIWebView或其滚动子视图使用自己的平移手势识别器来检测用户滚动。但是根据 Apple 的文档,有一种合法的方法可以用另一个手势识别器覆盖一个手势识别器。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.view并根据它是什么视图做出决定。

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

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

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

到目前为止,我只是在试验所有这些东西,它似乎或多或少地按照我的意愿工作。不过,我还没有尝试向 iStore 提交任何应用程序。但我相信到目前为止我还没有使用过任何无证的东西......如果有人发现它,请通知我。

于 2011-03-10T09:00:46.920 回答
1

(Xcode 5 iOS 7 SDK 示例)这是一个使用滚动视图 setBounces 函数的通用应用示例。这是一个开源项目/示例,位于此处:链接到 SimpleWebView(项目 Zip 和源代码示例)

于 2014-01-21T04:20:28.263 回答
0

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

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

于 2009-02-02T13:16:11.173 回答
0

查看 的bounces属性UIScrollView。引用 Apple 文档:

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

确保您使用的是正确的UIScrollView. 我不确定 a 的层次结构是什么样的UIWebView,但滚动视图可能是UIWebView.

于 2009-02-06T16:47:16.313 回答
0

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

[ObjWebview setUserInteractionEnabled:FALSE];

在本例中,ObjWebview是 类型UIWebView

于 2011-08-20T06:43:36.493 回答
0

webView.scrollView.scrollEnabled=否;webView.scrollView.bounces=否;

于 2012-09-10T10:00:43.253 回答