web-dev-qa-db-ja.com

UIWebViewが垂直方向に「バウンス」するのを停止しますか?

UIWebViewが垂直にバウンドするのを止める方法を知っている人はいますか?ユーザーがiPhoneの画面に触れ、指を下にドラッグすると、ウェブビューにはロードしたウェブページの上に空白のスポットが表示されますか?

私は次の可能な解決策を見ましたが、それらのどれも私のために働いていません:

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

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

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

224
Brad Parks
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についても同様です。

420
Mirek Rusin

QuickConnect と呼ばれる本格的なインストール可能なアプリケーションとしてWebアプリを簡単に作成できるプロジェクトを探していましたが、画面をスクロールしたくない場合に機能するソリューションを見つけました私の場合はそうしませんでした。

上記のプロジェクト/ブログの投稿では、バウンスをオフにするために追加できるjavascript関数について言及しています。

    document.ontouchmove = function(event){
        event.preventDefault();
    }

実装方法の詳細については、QuickConnectをダウンロードしてチェックアウトしてください。しかし、基本的には、ページの読み込み時にそのJavaScriptを呼び出すだけです。ドキュメントの先頭に配置するだけで、そしてそれはうまくいくようです。

46
Brad Parks

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

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

18
Zigglzworth

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

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

myWebView.scrollView.bounces = NO;

IWebView Class Reference を参照してください。

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

17
jstr

スイフト3

webView.scrollView.bounces = false
11
Ego Slayer

警告。私はアプリでsetAllowsRubberBanding:を使用しましたが、Appleはそれを拒否し、非パブリックAPI関数は許可されていないと述べました(引用:3.3.1)

9
Raf

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

webViewObj.scrollView.bounces = false
4
Jugal K Balara

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

ブラッドの方法は私のために働いた。使用する場合は、少し安全にしたいかもしれません。

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

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

3
Gavin Maclean

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

2
pedro

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ビューの適切なコンテンツサイズを設定する目立たない変更を強制します。
2
Rolf Hendriks

この答えを探して出くわしたので、最終的に私は自分自身の答えをいじってみました。やった

[[webview scrollView] setBounces:NO];

そしてそれは働いた。

2
Luke

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

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

または

[[webView scrollView] setScrollEnabled:NO];
2
Jason G

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
spymaster

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

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

ペストリーキットを掘る

1
cannyboy

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

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

1
S.P.

(Xcode 5 iOS 7 SDKの例)以下は、scrollview setBounces関数を使用したユニバーサルアプリの例です。ここにあるオープンソースプロジェクト/例です。 SimpleWebViewへのリンク(プロジェクトZipおよびソースコード例)

1

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

1
PP-RD

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

[ObjWebview setUserInteractionEnabled:FALSE];

この例では、ObjWebviewUIWebView型です。

0

bouncesUIScrollViewプロパティを調べます。 Appleのドキュメント:

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

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

0
Alex

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

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

0
rpetrich

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

0
Kumaresan P