禁用允许在UIWebView上滚动?


90

我必须在文章UITableView下显示一个Web 文章。

我发现的唯一选择是将文章显示UIWebView在tableView标头中。

为此,我必须获取webView内容的高度,并且必须禁用webView的滚动。

我发现了两种禁用滚动的解决方案:

for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).scrollEnabled=NO;

或在JavaScript中:

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

我听说苹果禁止使用第一种解决方案,但是我没有任何证据。使用此解决方案会拒绝我的申请吗?如果是这样,我可以使用第二种解决方案而不会被拒绝吗?

Answers:


297

从iOS5开始,我们可以直接访问UIWebView的滚动视图。
您可以禁用滚动和弹跳,如下所示:

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

3
非常感谢,这正是我想要的。@jsddour,您应将此答案标记为已接受!
marcgg 2012年

由于某种原因,这对我不起作用。:-(我已经将ScrollView和UIWebView放入其中。然后在viewWillAppear方法中设置以上两行。但是滚动仍然可以在Web视图中使用。有人可以帮忙吗? iOS 7模拟器
Amogh Natu

有什么用webView.scrollView.bounces = NO;?由于第一行中的代码已禁用滚动。
2014年

1
当人们回答并奔波而无需花时间给贡献者投赞成票时,就喜欢它。有没有办法通知用户请选择答案进行投票?
John Cogan

1
迅速的webView.scrollView.scrollEnabled = false /
webView.scrollView.bounces

26

由于此问题仍然适用,因此有一种新的解决方法!(iOS 7.0及更高版本,也许也为iOS 6,未确认)

webView.scrollView.scrollEnabled = NO;

照顾自己 :)


我不明白的是,为什么不在IB:/,cmon APPLE中,您在做什么呢!尽管如此,还是非常好的解决方案!
Mahmud Ahmad

20

您可以简单地将Web视图用户交互属性设置为no,即

webView.userInteractionEnabled = NO;

它非常简单并且可以正常工作,谢谢:)


28
但是,这样可以防止链接被窃听。
Graham Perks

@GrahamPerks我已针对您的评论对答案进行了编辑,请仔细阅读并批准,谢谢:)
Eshwar Chaitanya 2014年

12

对于所有ios版本,您可以使用以下代码代替setScrollEnabled:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}

首先,我尝试“ setScrollEnabled”方法,苹果拒绝了我的ipa。然后我改变了这种方法并接受了。
mturhan55 2012年

12

用这个 <body ontouchmove="event.preventDefault()">



7

我认为Javascript

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

是最好的解决方案。

确实 :

您的第一个例子,或者

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

一件事(相同的事情)可能会因为未记录而被拒绝,或者使您的应用在进一步的ios更新中崩溃。

[[myWebView scrollView] setBounces:NO];

方法不适用于iOS <5。


5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

为我整理了


4
依赖于此将是非常错误的,因为它不是公开的API。
Deepak Danduprolu 2011年

[[[[WebView子视图] lastObject] setScrollingEnabled:NO]; 为我整理了。无论如何,它不能回答我的问题。我的问题是我可以这样做吗?似乎禁止在SDK中禁用滚动。但我不确定。以及如何禁用javascript滚动。
jsaddour 2011年

没有证据表明我的建议实际上会通过调用subviews数组中的最后一个subiew并针对暴露的API设置scrollingEnabled来引起苹果的拒绝?一定?。是的,因为您可以使用它。虽然没有通过JavaScript的想法。抱歉。
iOSDude 2011年

3
不,您不应该这样做。正如Deepak所说,您不能依赖Apple UI元素之一中未记录的子视图内部顺序。如果他们在将来的OS更新中更改了内部结构,则您的应用程序将崩溃。他们特别警告要在多个地方执行此操作,并且许多应用程序由于升级到iPhone OS 3.0而中断。
布拉德·拉尔森



4

我认为Apple不禁止使用第一种选择。

你可以试试

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

如果您不希望任何链接在UIWebView中工作,也可以

[myWebView setUserInteractionEnabled:NO];


3

试试这个,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    

3

UIWebView在内放了一些UIScrollView,它不会滚动,除非我禁用了Webview上的用户交互(即使使用也是如此[[webview scrollview] setScrollEnabled:NO])。因此,我将UIWebViews放在了a UIView并为我工作,但随后HTML中的交互式链接或div UIWebView不再起作用。

对我而言唯一有效的方法是保留UIWebView内部内容,UIScrollView以便HTML交互起作用,但UIScrolling无效。

然后,我为Web视图创建了一个自定义委托,以侦听window.open("http:/customEvent")从Web视图中包含的HTML中调用的委托。我还添加了一个JavaScript滑动检测功能,它将触发我的自定义事件。

当webview委托收到此消息时,我会向控制器传递通知,然后该控制器动态滚动我的UIScrollView。显然,我必须构建一个逻辑来监视和滚动到下一页或上一页。不是最漂亮的解决方案,但它为我工作。


3

在您的HTML(<HEAD>标记)中尝试

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

它将禁用您的网页上的滚动。

(适用于任何网页,而不仅限于UIWebView)


2

我需要禁用滚动,因为关闭自定义键盘确实使webView的滚动混乱。没有其他办法,我求助于这样的事情:

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}

1

UIWebview和UIScrollview上的UITableView是否像您想要的那样设置webview的高度(并添加到Scrollview的ContentSize的总大小中)?


几乎。但是,在tableView标头中显示WebView似乎不太复杂。但是我的问题是:是否可以通过SDK禁用webView滚动?如果不是,我可以做javascript吗?
jsaddour 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.