UIWebViewのスクロールを無効にしますか?


90

記事のUITableView下にウェブ記事を表示する必要があります。

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

そのためには、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番目のソリューションを使用できますか?

回答:


297

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

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

3
本当にありがとう、それがまさに私が探していたものです。@jsddour、この回答を承認済みとしてマークする必要があります!
marcgg

どういうわけか、これは私のために働いていません。:-( ScrollViewを入れてUIWebViewを入れました。次に、上の2行をviewWillAppearメソッドに設定します。しかし、スクロールは引き続きWebビューで機能します。誰か助けてくれますか?参考までに、 iOS 7シミュレーター
Amogh Natu 2014

何の使用webView.scrollView.bounces = NO;ですか?最初の行のコードでスクロールが無効になっているためです。
Gon

1
貢献者に賛成票を投じるのに時間をかけずに回答が得られ、実行されるときに、それが大好きです。投票する答えを選択してくださいとユーザーに通知する方法はありませんか?
John Cogan、2016

1
for swift webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva

26

この質問はまだ当てはまるので、新しい方法があります。(iOS 7.0以降、おそらくiOS 6も確認されていません)

webView.scrollView.scrollEnabled = NO;

気を付けて :)


私が理解していないのは、それがIBにない理由です:/、cmon APPLE何をしていますか!それにもかかわらず非常に素晴らしい解決策!
Mahmud Ahmad

20

Webビューのユーザー操作プロパティをnoに設定するだけです。

webView.userInteractionEnabled = NO;

そのかなりシンプルでうまく機能します、ありがとう:)


28
ただし、これによりリンクがタップされるのを防ぎます。
Graham Perks 2013年

@GrahamPerks私はあなたのコメントに関して回答を編集しました、親切にレビューして承認してください、ありがとう:)
Eshwar Chaitanya 14

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



7

私はJavascriptだと思います

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

はるかに最善の解決策です。

確かに :

あなたの最初の受験者、または

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

文書化されていないために1つ(同じこと)が拒否されるか、以降のiOSアップデートでアプリがクラッシュする可能性があります。

そしてその

[[myWebView scrollView] setBounces:NO];

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


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

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


4
これは公開されたAPIではないので、これに依存するのは間違っているでしょう。
Deepak Danduprolu

[[[WebView subviews] lastObject] setScrollingEnabled:NO]; それは私のためにそれをソートしました。とにかく、それは私の質問に答えません。私の質問は、私がそれを行うことを許可されていることですか?SDKのスクロールを無効にすることは禁止されているようです。確信はないけど。そして、JavaScriptによるスクロールを無効にするのはどうでしょう。
jsaddour

私の提案がsubviews配列の最後のsubiewを呼び出し、それに対してscrollingEnabledを設定することにより、事実上、appleによる拒否を引き起こすという証拠はありませんか?APIが公開されていますか?きっと?ええ、それはあなたがそれを使うことができるからです。しかし、JavaScriptを介したアイデアはありません。ごめんなさい。
theiOSDude

3
いいえ、これを行うべきではありません。Deepakが言うように、AppleのUI要素の1つで、文書化されていないサブビューの内部順序に依存することはできません。将来のOSアップデートで内部構造が変更されると、アプリケーションがクラッシュします。彼らは特にこれを複数の場所で行うことについて警告しており、多くのアプリケーションがこれを行っただけでiPhone OS 3.0へのアップグレードに失敗しました。
ブラッド・ラーソン



4

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

あなたは試すことができます

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

UIWebViewでリンクを機能させたくない場合は、

[myWebView setUserInteractionEnabled:NO];



3

UIWebView内にいくつかのs を配置しUIScrollViewましたが、WebViewでのユーザー操作を無効にしない限り(それでも[[webview scrollview] setScrollEnabled:NO])、スクロールされませんでした。そのため、UIWebViewsをa内に配置し、UIViewそれが機能しましたが、HTML内のインタラクティブリンクまたはdiv UIWebViewが機能しなくなりました。

私のために機能した唯一のことは、HTMLの相互作用が機能するようにUIWebView内部を維持することですUIScrollViewが、UIScrolling機能しません。

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

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


3

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

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

それはあなたのウェブページのスクロールを無効にします。

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


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とUITableViewはUIScrollviewにあり、WebViewの高さを設定します(そしてScrollviewの合計ContentSizeに追加します)はあなたが望むものですか?


ほとんど。しかし、tableViewヘッダーにWebViewを表示する方が簡単なようです。しかし、私の質問は次のとおりです。SDKを介したwebViewスクロールを無効にできますか?そうでない場合、javascriptを使用できますか?
jsaddour

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.