UIWebViewが垂直方向にバウンドしないようにする方法を知っている人はいますか?つまり、ユーザーがiphone画面に触れて指を下方向にドラッグすると、ロードしたWebページの上にWebビューに空白のスポットが表示されます。
私は以下の可能な解決策を見ましたが、それらのどれも私にとってうまくいきませんでした:
UIWebViewが垂直方向にバウンドしないようにする方法を知っている人はいますか?つまり、ユーザーがiphone画面に触れて指を下方向にドラッグすると、ロードしたWebページの上にWebビューに空白のスポットが表示されます。
私は以下の可能な解決策を見ましたが、それらのどれも私にとってうまくいきませんでした:
回答:
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
。
UIWebView
電話[webView setBounces:NO]
できるようにしました。
私は、QuickConnectと呼ばれるiPhoneで本格的なインストール可能なアプリケーションとしてWebアプリを簡単に作成できるプロジェクトを探していて、画面をスクロールできないようにしたい場合に機能する解決策を見つけました。私はしませんでした。
上記のプロジェクト/ブログの投稿では、バウンスをオフにするために追加できるJavaScript関数について言及しています。
document.ontouchmove = function(event){
event.preventDefault();
}
それらがどのように実装されているかについてもっと知りたい場合は、QuickConnectをダウンロードしてチェックアウトするだけです。そしてそれはうまくいくようです。
これを達成するために私がやったすべては次のとおりです。
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が拒否するものです。
UIScrollView
最初のサブビューでUIWebView
ある可能性が高いという事実に依存していますが、これはiOSまたは特定の構成に対する将来の(マイナーな)更新でも簡単に変更される可能性があります。実際にを見つけるには、実際にfor
イテレーションを行う必要がありsubviews
ますUIScrollView
(実際にはそれほど多くの作業ではありません。少なくともUIScrollView
、プログラムを取得し、プログラムをクラッシュさせないことが保証されます...
iOS 5 SDKでは、サブビューを繰り返し処理するのではなく、Webビューに関連付けられたスクロールビューに直接アクセスできます。
したがって、スクロールビューで「バウンス」を無効にするには、次のように使用できます。
myWebView.scrollView.bounces = NO;
UIWebViewクラスリファレンスを参照してください。
(ただし、5.0より前のバージョンのSDKをサポートする必要がある場合は、Mirek Rusinのアドバイスに従ってください。)
ブラッドの方法がうまくいきました。使用する場合は、もう少し安全にすることができます。
id scrollView = [yourWebView.subviews objectAtIndex:0]; if([scrollView respondsToSelector:@selector(setAllowsRubberBanding :)]) { [scrollView performSelector:@selector(setAllowsRubberBanding :) withObject:NO]; }
アップルが何かを変更すると、バウンスが戻ってきますが、少なくともアプリはクラッシュしません。
iOS5では、ユーザーにWebviewコンテンツをズームさせる(ei:ダブルタップ)ことを計画している場合のみ、バウンス設定は十分ではありません。alwaysBounceHorizontalプロパティとalwaysBounceVerticalプロパティも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;
}
}
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オブジェクトがスクロールおよびバウンスするのを防ぐために、少し異なるアプローチを試しました。他のジェスチャーをオーバーライドするジェスチャー認識機能を追加しました。
これは、と思われるのUIWebViewまたはそのスクロールのサブビューは、ユーザーのスクロールを検出するために、独自のパンジェスチャー認識装置を使用しています。しかし、Appleのドキュメントによると、1つのジェスチャー認識機能を別の認識機能で上書きする正当な方法があります。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を分析し、それがどのビューであるかに基づいて決定を下します。
そして最後に、完全を期すために、panハンドラーとして登録したメソッド:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
Webビューのスクロールとバウンスをキャンセルすることだけが目的の場合は空にすることも、実際に必要な種類のパンモーションやアニメーションを実装するための独自のコードを含めることもできます...
これまでのところ、私はこのすべてのものを実験しているだけであり、それは多かれ少なかれ私が望むように機能しているようです。ただし、まだiStoreにアプリを送信することはしていません。しかし、私はこれまでに文書化されていないものは何も使用していないと思います...もし誰かがそれを見つけたら、私に知らせてください。
ここでは、2つの新しい潜在的なソリューションを示します。どうやら、jqtouchまたはpastrykitを使用してスクロールを無効にできます。しかし、私はこれらを機能させることができません。あなたはもっと有能かもしれません。
このリンクは私にとても役立ちました.....それは簡単です..デモがあります..
(Xcode 5 iOS 7 SDKの例)次に、scrollview setBounces関数を使用したユニバーサルアプリの例を示します。これは、次の場所にあるオープンソースプロジェクト/例です:SimpleWebViewへのリンク(プロジェクトのZipとソースコードの例)
サブビューの一つがUIWebView
なければなりませんUIScrollView
。scrollEnabled
プロパティをに設定するNO
と、Webビューでスクロールが完全に無効になります。
注:これは技術的にプライベートAPIを使用しているため、将来のOSリリースでアプリが拒否されるかクラッシュする可能性があります。使用@try
してrespondsToSelector
UIWebView
スクロールを無効にするには、次のコード行を使用できます。
[ObjWebview setUserInteractionEnabled:FALSE];
この例でObjWebview
は、タイプはUIWebView
です。