阻止UIWebView垂直“弹跳”?

问题描述 投票:221回答:22

有谁知道如何阻止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

How do I stop a UIScrollView from bouncing horizontally?

ios objective-c iphone uiscrollview uiwebview
22个回答
420
投票
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


2
投票

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


2
投票

在我看来,UIWebView有一个UIScrollView。您可以为此使用记录的API,但是为两个方向设置弹跳,而不是单独设置。这是在API文档中。 UIScrollView有一个反弹属性,所以像这样的东西工作(不知道是否有多个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;
    }
}

2
投票

我很恼火地发现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;

}

然后,在创建自定义Web视图时,可以使用以下命令禁用弹跳:

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

这是一种很好的通用方法,可以使用可自定义的滚动行为来创建Web视图。有几点需要注意:

  • 与任何视图一样,您还需要覆盖 - (id)initWithCoder:如果您在Interface Builder中使用它
  • 最初创建Web视图时,其内容大小始终与视图框架的大小相同。滚动Web后,内容大小表示视图中实际Web内容的大小。为了解决这个问题,我做了一些hacky - 调用-setContentOffset:CGPointMake(0,1)动画:是强制一个不明显的更改,它将设置Web视图的正确内容大小。

2
投票

遇到了这个寻找答案的问题,我最终只是通过搞乱来回答我自己的答案。我做到了

[[webview scrollView] setBounces:NO];

它起作用了。


2
投票

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

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

要么

[[webView scrollView] setScrollEnabled:NO];

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提交任何应用程序。但我相信到目前为止我还没有使用任何无证件......如果有人发现,请通知我。


1
投票

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

turning off vertical scrolling

digging into pastrykit


1
投票

fixed positioning on mobile safari

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


1
投票

(Xcode 5 iOS 7 SDK示例)这是使用scrollview setBounces函数的Universal App示例。它是一个开源项目/示例,位于:Link to SimpleWebView (Project Zip and Source Code Example)


0
投票

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

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


46
投票

我正在研究一个项目,它可以很容易地创建Web应用程序,作为iPhone上名为QuickConnect的完全成熟的可安装应用程序,并找到一个有效的解决方案,如果你不想让你的屏幕可以滚动,在我的情况下我没有。

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

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

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


0
投票

看看bouncesUIScrollView财产。请参阅Apple文档:

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

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


0
投票

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

[ObjWebview setUserInteractionEnabled:FALSE];

在这个例子中,ObjWebviewUIWebView类型。


0
投票

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


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应用程序中使用它。


17
投票

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

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

myWebView.scrollView.bounces = NO;

UIWebView Class Reference

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


11
投票

斯威夫特3

webView.scrollView.bounces = false

9
投票

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


4
投票

在Swift中禁用弹跳

webViewObj.scrollView.bounces = false

3
投票

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

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

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


3
投票

仅在iOS5上,如果您打算让用户缩放webview内容(e.i:双击),则弹跳设置是不够的。您还需要将alwaysBounceHorizo​​ntal和alwaysBounceVertical属性设置为NO,否则当它们缩小(另一个双击......)为默认值时,它将再次反弹。

© www.soinside.com 2019 - 2024. All rights reserved.