UIWebView が垂直方向にバウンスするのを止める方法を知っている人はいますか? つまり、ユーザーが iPhone の画面に触れて指を下にドラッグすると、読み込んだ Web ページの上に空白の場所が表示されます。
次の可能な解決策を見てきましたが、どれもうまくいきませんでした:
UIWebView が垂直方向にバウンスするのを止める方法を知っている人はいますか? つまり、ユーザーが iPhone の画面に触れて指を下にドラッグすると、読み込んだ Web ページの上に空白の場所が表示されます。
次の可能な解決策を見てきましたが、どれもうまくいきませんでした:
for (id subview in webView.subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).bounces = NO;
...うまくいくようです。
App Storeにも受け入れられます。
更新: iOS 5.x+ ではもっと簡単な方法があります - UIWebView
hasscrollView
プロパティなので、コードは次のようになります。
webView.scrollView.bounces = NO;
についても同様ですWKWebView
。
これを達成するために私がしたことは次のとおりです。
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;
UIWebView クラス リファレンスを参照してください。
(ただし、SDK の 5.0 より前のバージョンをサポートする必要がある場合は、Mirek Rusin のアドバイスに従う必要があります。)
スイフト3
webView.scrollView.bounces = false
警告。私は自分のアプリで setallowsRubberBanding: を使用しましたが、Apple はそれを拒否し、非公開の API 関数は許可されていないと述べました (cite: 3.3.1)。
Swift でバウンスを無効にする
webViewObj.scrollView.bounces = false
ブラッドの方法は私のために働いた。あなたがそれを使うならば、あなたはそれをもう少し安全にしたいかもしれません。
id scrollView = [yourWebView.subviews objectAtIndex:0]; if([scrollView replysToSelector:@selector(setAllowsRubberBanding :)]) {{ [scrollView PerformSelector:@selector(setAllowsRubberBanding :) withObject:NO]; }
Appleが何かを変更すると、バウンスが戻りますが、少なくともアプリはクラッシュしません。
iOS5 では、ユーザーが Web ビューのコンテンツをズーム (ei: ダブルタップ) できるようにする場合にのみ、バウンス設定が十分ではありません。また、alwaysBounceHorizontal および alwaysBounceVertical プロパティを NO に設定する必要があります。そうしないと、ズームアウトすると (別のダブルタップ...)、デフォルトに戻ります。
答えを探しているこのことに出くわしました、そして私は結局、いじって自分の答えを運んだだけでした。やった
[[webview scrollView] setBounces:NO];
そしてそれはうまくいった。
UIWebViewのサブビューのコレクションをトラバースし、それらの背景を[UIColor blackColor]に設定しました。これは、Webページの背景と同じ色です。ビューはバウンスしますが、その醜い濃い灰色の背景は表示されません。
これは私にとってはうまくいきましたが、美しくも機能しました(webViewでphonegapを使用しています)
[[webView.webView scrollView] setScrollEnabled:NO];
また
[[webView scrollView] setScrollEnabled:NO];
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 ビューを作成するための優れた汎用的な方法です。注意すべき点がいくつかあります。
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;
}
}
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を分析して、それがどのビューであるかに基づいて決定を下す場合があります。
そして最後に、完全を期すために、パンハンドラーとして登録したメソッド:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
Webビューのスクロールとバウンスをキャンセルするだけの場合は空にすることも、本当に必要な種類のパンモーションとアニメーションを実装するための独自のコードを含めることもできます...
これまでのところ、私はこれらすべてのものを試しているだけで、多かれ少なかれ私が望むように機能しているようです。ただし、まだiStoreにアプリを送信しようとはしていません。しかし、私はこれまで文書化されていないものを使用したことはないと思います...誰かがそれを見つけた場合は、私に知らせてください。
2 つの新しい潜在的なソリューションを次に示します。どうやら、jqtouch または pastrykit を使用してスクロールを無効にできます。しかし、私はこれらを機能させていません。あなたはもっと有能かもしれません。
このリンクは私を大いに助けました.....簡単です..デモがあります..
のbounces
プロパティを調べますUIScrollView
。Appleドキュメントを引用してください:
プロパティの値が
YES
(デフォルト)の場合、コンテンツの境界に遭遇するとスクロールビューがバウンスします。視覚的にバウンスすることは、スクロールがコンテンツの端に到達したことを示します。値がの場合NO
、スクロールはバウンスせずにコンテンツ境界ですぐに停止します。
正しいものを使用していることを確認してくださいUIScrollView
。の階層がどのように見えるかはわかりませんUIWebView
が、スクロールビューはの子ではなく親である可能性がありUIWebView
ます。
のサブビューの 1 つは であるUIWebView
必要がありUIScrollView
ます。scrollEnabled
プロパティを に設定するNO
と、Web ビューのスクロールが完全に無効になります。
注: これは技術的にプライベート API を使用しているため、将来の OS リリースでアプリが拒否されるか、クラッシュする可能性があります。使用@try
してrespondsToSelector
スクロールを無効にするUIWebView
には、次のコード行を使用できます。
[ObjWebview setUserInteractionEnabled:FALSE];
この例でObjWebview
は、タイプはUIWebView
です。