UIWebViewが垂直にバウンドするのを止める方法を知っている人はいますか?ユーザーがiPhoneの画面に触れ、指を下にドラッグすると、ウェブビューにはロードしたウェブページの上に空白のスポットが表示されますか?
私は次の可能な解決策を見ましたが、それらのどれも私のために働いていません:
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
についても同様です。
QuickConnect と呼ばれる本格的なインストール可能なアプリケーションとしてWebアプリを簡単に作成できるプロジェクトを探していましたが、画面をスクロールしたくない場合に機能するソリューションを見つけました私の場合はそうしませんでした。
上記のプロジェクト/ブログの投稿では、バウンスをオフにするために追加できるjavascript関数について言及しています。
document.ontouchmove = function(event){
event.preventDefault();
}
実装方法の詳細については、QuickConnectをダウンロードしてチェックアウトしてください。しかし、基本的には、ページの読み込み時にそのJavaScriptを呼び出すだけです。ドキュメントの先頭に配置するだけで、そしてそれはうまくいくようです。
これを達成するために私がしたことは、次のとおりです。
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が拒否するものです。
IOS 5 SDKでは、サブビューを反復処理するのではなく、Webビューに関連付けられたスクロールビューに直接アクセスできます。
スクロールビューで「バウンス」を無効にするには、次を使用できます。
myWebView.scrollView.bounces = NO;
IWebView Class Reference を参照してください。
(ただし、SDK 5.0より前のバージョンをサポートする必要がある場合は、 Mirek Rusinのアドバイス に従う必要があります。)
スイフト3
webView.scrollView.bounces = false
警告。私はアプリでsetAllowsRubberBanding:を使用しましたが、Appleはそれを拒否し、非パブリックAPI関数は許可されていないと述べました(引用:3.3.1)
Swiftでバウンスを無効にする
webViewObj.scrollView.bounces = false
IOS5では、ユーザーがWebビューのコンテンツをズームできるようにする場合(例:ダブルタップ)、バウンス設定では不十分です。 alwaysBounceHorizontalプロパティとalwaysBounceVerticalプロパティもNOに設定する必要があります。そうしないと、ズームアウト(別のダブルタップ...)するとデフォルトに戻り、再びバウンスします。
ブラッドの方法は私のために働いた。使用する場合は、少し安全にしたいかもしれません。
id scrollView = [yourWebView.subviews objectAtIndex:0]; if([scrollView respondsToSelector:@selector(setAllowsRubberBanding :)]) { [scrollView performSelector:@selector(setAllowsRubberBanding :) withObject:NO]; }
Appleが何かを変更すると、バウンスが戻りますが、少なくともアプリはクラッシュしません。
UIWebViewのサブビューのコレクションを走査し、背景をWebページの背景と同じ色の[UIColor blackColor]に設定しました。ビューはバウンドしますが、そのい暗い灰色の背景は表示されません。
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ビューを作成するための優れた汎用方法です。次の点に注意してください。
この答えを探して出くわしたので、最終的に私は自分自身の答えをいじってみました。やった
[[webview scrollView] setBounces:NO];
そしてそれは働いた。
これは私にとってもうまくいきました(webViewでphonegapを使用しています)
[[webView.webView scrollView] setScrollEnabled:NO];
または
[[webView scrollView] setScrollEnabled:NO];
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;
}
}
以下に、2つの新しい潜在的なソリューションを示します。どうやら、jqtouchまたはpastrykitを使用してスクロールを無効にできます。ただし、これらを機能させることはできません。あなたはより有能かもしれません。
このリンクは私を大いに助けてくれました.....それは簡単です..デモがあります..
(Xcode 5 iOS 7 SDKの例)以下は、scrollview setBounces関数を使用したユニバーサルアプリの例です。ここにあるオープンソースプロジェクト/例です。 SimpleWebViewへのリンク(プロジェクトZipおよびソースコード例)
IWebViewオブジェクトのスクロールとバウンスを防ぐために、少し異なるアプローチを試しました。他のジェスチャをオーバーライドするジェスチャ認識機能を追加しました。
IWebViewまたはそのスクロールサブビューが独自のパンジェスチャレコグナイザーを使用してユーザーのスクロールを検出しているようです。しかし、Appleのドキュメントによると、あるジェスチャレコグナイザーを別のジェスチャレコグナイザーで無効にする正当な方法があります。 IGestureRecognizerDelegateプロトコルにはメソッドがありますgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:-衝突するジェスチャ認識機能の動作を制御できます。
だから、私がやったことは
view Controllerの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を分析し、ビューに基づいて決定を下すことができます。
そして最後に、完全を期すために、パンハンドラーとして登録したメソッド:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
webビューのスクロールとバウンスをキャンセルするだけの場合は空にすることも、本当に必要なパンモーションとアニメーションを実装する独自のコードを含めることもできます...
これまでのところ、私はこのすべてを試しているだけで、多かれ少なかれ望んでいるように思えます。ただし、まだiStoreにアプリを送信しようとしていません。しかし、私はこれまで文書化されていないものを使用したことはないと信じています...他の誰かがそれを見つけた場合、私に知らせてください。
UIWebView
スクロールを無効にするには、次のコード行を使用できます。
[ObjWebview setUserInteractionEnabled:FALSE];
この例では、ObjWebview
はUIWebView
型です。
bounces
のUIScrollView
プロパティを調べます。 Appleのドキュメント:
プロパティの値が
YES
(デフォルト)の場合、スクロールビューはコンテンツの境界に達するとバウンドします。跳ね返ると、スクロールがコンテンツの端に達したことが視覚的に示されます。値がNO
の場合、スクロールせずにコンテンツの境界でスクロールが停止します。
正しいUIScrollView
を使用していることを確認してください。 UIWebView
の階層がどのように見えるかはわかりませんが、スクロールビューはUIWebView
の子ではなく親になる可能性があります。
UIWebView
のサブビューの1つはUIScrollView
でなければなりません。 scrollEnabled
プロパティをNO
に設定すると、Webビューのスクロールが完全に無効になります。
注:これは技術的にプライベートAPIを使用しているため、将来のOSリリースでアプリが拒否またはクラッシュする可能性があります。 @try
とrespondsToSelector
を使用します
webView.scrollView.scrollEnabled = NO; webView.scrollView.bounces = NO;