ChatGPT解决这个技术问题 Extra ChatGPT

阻止 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?

我希望您已经考虑过禁用该功能的可用性影响。它的存在是有原因的。也就是说,我也很好奇,你会怎么做。
我将它嵌入到我的应用程序中的方式,它与我拥有的其他一些视图元素看起来无缝,并且唯一没有出现的情况是反弹发生时......虽然绝对是一个好点!

S
S.M.Mousavi
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 也是如此。


有用。不需要子类化,如果 Apple 改变 UIWebView 层次结构,它不应该崩溃。
这个修复似乎只适用于我的 OS 4.1 模拟器,不适用于我的 OS 3.1.3 iPhone。有人知道此修复程序是否仅适用于特定的操作系统版本吗?
@MirukRusin - 你怎么能保证这个应用程序会被接受基于三行代码? :P
@Mirek - 你错过了我的意思。你怎么知道应用程序中没有其他任何东西会被拒绝?
这对我来说很好。为方便起见,我在 UIWebView 中添加了一个类别,以便可以在任何我想调用的地方调用 [webView setBounces:NO]
B
Brad Parks

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

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

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

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


这个答案是停止 UIWebView 中内容垂直滚动的正确方法。
你本可以给出完整的答案,首先我不想下载另一个应用程序的完整源代码,我什至找不到它。您的回答取决于另一个网站与您回答时的情况相同。
有时似乎需要这个答案和上面接受的答案。在我的例子中,我发现如果 web 视图还没有加载,那么在上面的 JS 实际加载到系统之前,弹性就会一直存在。所以答案似乎是这个和上面接受的答案有时都是必需的。
正如 Jessedc 所说,这将停止垂直滚动,而不仅仅是弹跳。这意味着如果您有 div 左右需要滚动,它将不会滚动。
Z
Zigglzworth

好吧,我所做的就是:

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 会拒绝这个问题的答案。


这是最好也是最简单的方法。这应该是公认的答案! +1
不要那样做 - 我的应用程序因使用第一行而被拒绝。浪费了我这么多时间。我用 [[webView.subviews lastObject] setScrollEnabled:NO];苹果说这是一个私有 API,因此拒绝了它;我现在要重新提交,但使用了“userInteractionEnabled:NO”,因为我不需要应用程序中的任何活动链接。
UIWebView 继承自 UIView。 UIView 具有属性子视图。什么是私人的?所有这些您都可以在 developer.apple.com 上找到
我在 appstore 上有 4 个使用这个的应用程序。您的应用显然因其他原因被拒绝。这不是私有 API。
这真的不是一个好主意。您所依赖的事实是 UIScrollViewUIWebView 的第一个子视图,现在可能就是这种情况,但这很容易在未来(甚至是较小的)iOS 更新或特定配置中发生变化。您确实应该在 subviews 上进行 for 迭代以实际找到 UIScrollView(这实际上并没有那么多工作,至少您可以保证获得 UIScrollView 而不会使您的程序崩溃......
C
Community

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

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

myWebView.scrollView.bounces = NO;

请参阅 UIWebView Class Reference

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


E
Ego Slayer

斯威夫特 3

webView.scrollView.bounces = false

R
Raf

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


J
Jugal K Balara

在 Swift 中禁用反弹

webViewObj.scrollView.bounces = false

G
Gavin Maclean

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

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

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


i
il Malvagio Dottor Prosciutto

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


p
pedro

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


实际上这是一个非常糟糕的问题,因为如果 Apple 改变了 UIWebView 的内部结构,这个 hack 可能会崩溃。
s
spymaster

在我看来,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;
    }
}

R
Rolf Hendriks

我很生气地发现 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 视图时,其内容大小始终与视图框架的大小相同。滚动网页后,内容大小表示视图中实际网页内容的大小。为了解决这个问题,我做了一些骇人听闻的事情——调用 -setContentOffset:CGPointMake(0,1)animated:YES 来强制进行不明显的更改,从而设置 Web 视图的正确内容大小。


L
Luke

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

[[webview scrollView] setBounces:NO];

它奏效了。


J
Jason G

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

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

或者

[[webView scrollView] setScrollEnabled:NO];

P
PP-RD

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


N
NANNAV

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

turning off vertical scrolling

digging into pastrykit


N
NANNAV

fixed positioning on mobile safari

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


M
Matthew Ferguson

(Xcode 5 iOS 7 SDK 示例)这是一个使用滚动视图 setBounces 函数的通用应用示例。这是一个开源项目/示例,位于:Link to SimpleWebView (Project Zip and Source Code Example)


r
rpetrich

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

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


我试过了,当我尝试它时它会出错......奇怪的是,我可以访问和设置 scrollView.bounces(没有效果),但是当我尝试设置 scrollEnabled 时,它会出错......
我相信子视图称为 UIScroller,而不是 UIScrollView。 UIScroller 是一个未记录且不受支持的类,它与 UIScrollView 有很多共同点,但您不能依赖于所有工作方式相同且不会在未来的操作系统版本中更改的类。
我在运行 iOS 3.2 的 iPad(不是 iPhone)应用程序上执行此操作,并且能够从我的 UIWebView 中获取 UIScrollView。我成功地定制了这个视图来改变它的弹跳行为,所以我可以证明它在 iPad 上的工作。我的应用程序没有通过应用程序商店,但我认为这里没有记录的 API 不会有问题。这个解决方案的聪明之处在于,您只是在遍历 UIView 层次结构并使用 UIScrollView - 这两者都是完美的。
A
Alex

查看 UIScrollViewbounces 属性。引用 Apple 文档:

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

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


u
user7116

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

[ObjWebview setUserInteractionEnabled:FALSE];

在此示例中,ObjWebview 属于 UIWebView 类型。


K
Kumaresan P

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅