阻止UIWebView垂直“弹跳”?

时间:2009-02-01 13:08:31

标签: ios objective-c iphone uiscrollview uiwebview

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

22 个答案:

答案 0 :(得分:416)

答案 1 :(得分:46)

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

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

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

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

答案 2 :(得分: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应用程序。

答案 3 :(得分:17)

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

所以禁用'弹跳'在滚动视图中,您可以使用:

myWebView.scrollView.bounces = NO;

请参阅UIWebView Class Reference

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

答案 4 :(得分:10)

Swift 3

webView.scrollView.bounces = false

答案 5 :(得分:9)

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

答案 6 :(得分:4)

在Swift中禁用退回

webViewObj.scrollView.bounces = false

答案 7 :(得分:3)

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

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

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

答案 8 :(得分:3)

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

答案 9 :(得分:2)

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

答案 10 :(得分: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;
    }
}

答案 11 :(得分: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)animated:YES强制进行一次不明显的更改,以便设置Web视图的正确内容大小。

答案 12 :(得分:2)

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

[[webview scrollView] setBounces:NO];

并且有效。

答案 13 :(得分:2)

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

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

[[webView scrollView] setScrollEnabled:NO];

答案 14 :(得分:1)

fixed positioning on mobile safari

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

答案 15 :(得分: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
}

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

到目前为止,我只是在试验所有这些东西,而且它似乎或多或少都在我想要它。不过,我还没有尝试过向iStore提交任何应用程序。但我相信到目前为止我还没有使用任何无证件......如果有人发现,请通知我。

答案 16 :(得分:1)

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

turning off vertical scrolling

digging into pastrykit

答案 17 :(得分:1)

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

答案 18 :(得分:0)

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

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

查看bounces的{​​{1}}属性。请参阅Apple文档:

  

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

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

答案 21 :(得分:0)

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

[ObjWebview setUserInteractionEnabled:FALSE];

在此示例中,ObjWebview的类型为UIWebView