web-dev-qa-db-ja.com

許可されたUIWebViewでスクロールを無効にしますか?

記事の下にUITableViewを含むWeb記事を表示する必要があります。

私が見つけた唯一のオプションは、tableViewヘッダーのUIWebViewに記事を表示することでした。

そのためには、webViewコンテンツの高さを取得する必要があり、webViewのスクロールを無効にする必要があります。

スクロールを無効にする2つの解決策を見つけました。

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();
}

最初の解決策はAppleによって禁止されていると聞きましたが、その証拠はありません。このソリューションを使用すると、私のアプリケーションは拒否されますか?その場合、拒否されることなく2番目のソリューションを使用できますか?

89
jsaddour

IOS5以降では、UIWebViewのスクロールビューに直接アクセスできます。
次のようにスクロールとバウンスを無効にできます。

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;
294
Alex Stanciu

この質問はまだ適用可能であるため、新しい方法があります! (iOS 7.0以降、おそらくiOS 6も未確認)

webView.scrollView.scrollEnabled = NO;

気を付けて :)

25
Ryan Copley

Webビューのユーザーインタラクションプロパティをnoに設定するだけです。

webView.userInteractionEnabled = NO;

その非常にシンプルでうまく動作します、ありがとう:)

20

すべてのiOSバージョンで、setScrollEnabledの代わりにこのコードを使用できます。

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

これを使用<body ontouchmove="event.preventDefault()">

11
Gobi M

Swift 3バージョン

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false
9
Ahmed Safadi

Javascript

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

最適なソリューションです。

確かに :

あなたの最初の例、または

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

文書化されていないために1つ(同じもの)が拒否されるか、さらにiOSの更新でアプリがクラッシュする可能性があります。

そしてその

[[myWebView scrollView] setBounces:NO];

メソッドはiOS <5では機能しません。

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

それは私のためにそれをソートしました

5
theiOSDude

[[WebView scrollView] set Bounces:NO];

5
mafonya

1つ目はAppleによって拒否されました。それはちょうど今朝私に起こりました。

5
Jane Sales

これを使って :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];
4
Pawel Molodkin

Appleが最初の選択肢を禁じているとは思わない。

試すことができます

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

UIWebViewでリンクを機能させたくない場合は、次のこともできます。

[myWebView setUserInteractionEnabled:NO];
4
Nick Bull

これを試して、

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

HTMLでこれを試してください(<HEAD>タグ)

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

Webページのスクロールが無効になります。

(UIWebViewだけでなく、どのWebページでも動作します)

3
Gik

UIWebViewの中にいくつかのUIScrollViewを配置しましたが、Webビューでのユーザーの操作を無効にしない限り([[webview scrollview] setScrollEnabled:NO]を使用しても)スクロールしませんでした。 UIWebView内にUIViewsを配置しましたが、それはうまくいきましたが、UIWebView内のHTMLのインタラクティブリンクまたはdivはもう機能しませんでした。

私のために働いた唯一のことは、UIWebViewUIScrollView内に保持することで、HTMLインタラクションは機能しますが、UIScrollingは機能しません。

次に、Webビューに含まれるHTMLから呼び出されるwindow.open("http:/customEvent")をリッスンするWebビューのカスタムデリゲートを作成しました。また、カスタムイベントを起動するJavaScriptスワイプ検出も追加しました。

WebViewデリゲートがこれを受け取ると、通知をコントローラーに渡し、コントローラーはUIScrollViewを動的にスクロールします。明らかに、次のページまたは前のページを監視してスクロールするロジックを作成する必要がありました。最もきれいな解決策ではありませんが、それは私のために働いています。

3
Mark

カスタムキーボードを閉じると、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;
    }
}
2
akiraspeirs

UIWebviewとUITableviewはUIScrollviewにあり、WebViewの高さを設定(およびScrollviewのContentSizeの合計に追加)したいですか?

1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];
1
imran ahmed