229

UIWebView が垂直方向にバウンスするのを止める方法を知っている人はいますか? つまり、ユーザーが iPhone の画面に触れて指を下にドラッグすると、読み込んだ Web ページの上に空白の場所が表示されます。

次の可能な解決策を見てきましたが、どれもうまくいきませんでした:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html

http://forums.macrumors.com/showthread.php?t=619534

UIScrollView が水平方向にバウンスするのを止めるにはどうすればよいですか?

4

22 に答える 22

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

...うまくいくようです。

App Storeにも受け入れられます。

更新: iOS 5.x+ ではもっと簡単な方法があります - UIWebViewhasscrollViewプロパティなので、コードは次のようになります。

webView.scrollView.bounces = NO;

についても同様ですWKWebView

于 2010-07-24T11:22:43.423 に答える
18

これを達成するために私がしたことは次のとおりです。

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が拒否するものです.

于 2010-08-22T15:39:23.220 に答える
17

iOS 5 SDK では、サブビューを反復処理するのではなく、Web ビューに関連付けられたスクロール ビューに直接アクセスできます。

したがって、スクロールビューで「バウンス」を無効にするには、次を使用できます。

myWebView.scrollView.bounces = NO;

UIWebView クラス リファレンスを参照してください。

(ただし、SDK の 5.0 より前のバージョンをサポートする必要がある場合は、Mirek Rusin のアドバイスに従う必要があります。)

于 2011-12-29T00:28:01.813 に答える
12

スイフト3

webView.scrollView.bounces = false
于 2016-11-16T06:58:36.037 に答える
9

警告。私は自分のアプリで setallowsRubberBanding: を使用しましたが、Apple はそれを拒否し、非公開の API 関数は許可されていないと述べました (cite: 3.3.1)。

于 2009-11-16T17:29:31.570 に答える
4

Swift でバウンスを無効にする

webViewObj.scrollView.bounces = false
于 2016-09-01T10:13:13.990 に答える
3

ブラッドの方法は私のために働いた。あなたがそれを使うならば、あなたはそれをもう少し安全にしたいかもしれません。

id scrollView = [yourWebView.subviews objectAtIndex:0];
if([scrollView replysToSelector:@selector(setAllowsRubberBanding :)])
{{
    [scrollView PerformSelector:@selector(setAllowsRubberBanding :) withObject:NO];
}

Appleが何かを変更すると、バウンスが戻りますが、少なくともアプリはクラッシュしません。

于 2009-07-18T15:21:32.130 に答える
3

iOS5 では、ユーザーが Web ビューのコンテンツをズーム (ei: ダブルタップ) できるようにする場合にのみ、バウンス設定が十分ではありません。また、alwaysBounceHorizo​​ntal および alwaysBounceVertical プロパティを NO に設定する必要があります。そうしないと、ズームアウトすると (別のダブルタップ...)、デフォルトに戻ります。

于 2011-10-12T08:05:09.010 に答える
2

答えを探しているこのことに出くわしました、そして私は結局、いじって自分の答えを運んだだけでした。やった

[[webview scrollView] setBounces:NO];

そしてそれはうまくいった。

于 2012-01-20T13:57:30.290 に答える
2

UIWebViewのサブビューのコレクションをトラバースし、それらの背景を[UIColor blackColor]に設定しました。これは、Webページの背景と同じ色です。ビューはバウンスしますが、その醜い濃い灰色の背景は表示されません。

于 2010-03-02T09:51:13.977 に答える
2

これは私にとってはうまくいきましたが、美しくも機能しました(webViewでphonegapを使用しています)

[[webView.webView scrollView] setScrollEnabled:NO];

また

[[webView scrollView] setScrollEnabled:NO];
于 2013-08-21T19:02:14.987 に答える
2

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 ビューを作成するための優れた汎用的な方法です。注意すべき点がいくつかあります。

  • 他のビューと同様に、Interface Builder で使用する場合は -(id)initWithCoder: もオーバーライドする必要があります。
  • 最初に Web ビューを作成するとき、そのコンテンツ サイズは常にビューのフレームのサイズと同じです。Web をスクロールした後のコンテンツ サイズは、ビュー内の実際の Web コンテンツのサイズを表します。これを回避するために、 -setContentOffset:CGPointMake(0,1)animated:YES を呼び出して、Web ビューの適切なコンテンツ サイズを設定する目立たない変更を強制するというハックなことをしました。
于 2010-06-08T20:55:54.357 に答える
2

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;
    }
}
于 2010-06-03T08:05:36.947 に答える
1

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にアプリを送信しようとはしていません。しかし、私はこれまで文書化されていないものを使用したことはないと思います...誰かがそれを見つけた場合は、私に知らせてください。

于 2011-03-10T09:00:46.920 に答える
1

2 つの新しい潜在的なソリューションを次に示します。どうやら、jqtouch または pastrykit を使用してスクロールを無効にできます。しかし、私はこれらを機能させていません。あなたはもっと有能かもしれません。

垂直スクロールをオフにする

ペストリーキットを掘り下げる

于 2009-12-16T14:17:00.817 に答える
1

モバイルサファリでの位置固定

このリンクは私を大いに助けました.....簡単です..デモがあります..

于 2010-01-22T14:01:51.327 に答える
0

bouncesプロパティを調べますUIScrollView。Appleドキュメントを引用してください:

プロパティの値がYES(デフォルト)の場合、コンテンツの境界に遭遇するとスクロールビューがバウンスします。視覚的にバウンスすることは、スクロールがコンテンツの端に到達したことを示します。値がの場合NO、スクロールはバウンスせずにコンテンツ境界ですぐに停止します。

正しいものを使用していることを確認してくださいUIScrollView。の階層がどのように見えるかはわかりませんUIWebViewが、スクロールビューはの子ではなく親である可能性がありUIWebViewます。

于 2009-02-06T16:47:16.313 に答える
0

のサブビューの 1 つは であるUIWebView必要がありUIScrollViewます。scrollEnabledプロパティを に設定するNOと、Web ビューのスクロールが完全に無効になります。

注: これは技術的にプライベート API を使用しているため、将来の OS リリースでアプリが拒否されるか、クラッシュする可能性があります。使用@tryしてrespondsToSelector

于 2009-02-02T13:16:11.173 に答える
0

スクロールを無効にするUIWebViewには、次のコード行を使用できます。

[ObjWebview setUserInteractionEnabled:FALSE];

この例でObjWebviewは、タイプはUIWebViewです。

于 2011-08-20T06:43:36.493 に答える