0

こんにちは、すべてを検索しましたが、これがわかりませんでした!

5 つのナビゲーション コントロールを備えたタブ バー コントローラーがあり、ナビゲーション コントロールの 1 つに、内部にテーブル ビューがあるビューがあり、その項目をクリックすると新しいビューがプッシュされ、そのビューには

  view
     -webview
     -view

ツールバーとナビゲーションバーを非表示にするためにシングルタップを処理する必要があり、webview がすべてのタッチを食べていたため、2 番目のビュー (透明) を作成します。そのビューを配置し、View Controller に実装します

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
 UITouch* touch = [touches anyObject];
 if(touch.tapCount == 2){
  [NSObject cancelPreviousPerformRequestsWithTarget:self];
 } 
 [[wv.subviews objectAtIndex:0] touchesBegan:touches withEvent:event];
 [super touchesBegan:touches withEvent:event];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
 [[wv.subviews objectAtIndex:0] touchesMoved:touches withEvent:event];
 [super touchesMoved:touches withEvent:event];
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
 UITouch* touch = [touches anyObject];
 if(touch.tapCount == 1){
  [self performSelector:@selector(hideBars) withObject:nil afterDelay:0.3];
 }
 [[wv.subviews objectAtIndex:0] touchesEnded:touches withEvent:event];
 [super touchesEnded:touches withEvent:event];
}

-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
 [[wv.subviews objectAtIndex:0] touchesCancelled:touches withEvent:event];
 [super touchesCancelled:touches withEvent:event];
}

wv は私の UIWebView IBOutlet であり、コントローラーでタッチを取得して Web ビューに送信できるようになりました。すべてが機能していると思ったので、スクロールできますが、リンクがあるとクリックできません。そして、webview は、私がそのテストを行ったリンクを検出しています。リンクに触れるためにこれを実装する他の方法はありますか、またはこの回避策を変更してツールバーを非表示にし、webview を完全に機能させる必要がありますか? 事前に助けてくれてありがとう。

4

1 に答える 1

0

OK、問題は解決しませんでしたが、この状況の回避策があります。

UIWebView はすべてのタッチを取得し、ユーザー インタラクションを無効にした場合にのみ、それらを他のビューに渡しません。また、UIWebView の実装で touchesBegan などをオーバーライドすることはできません。それで、解決策は何ですか?

私が言及したように、UIWebViewの上にUIViewを配置すると、タッチを取得してWebビューに渡すことができますが、リンクをクリックしたり、ズームしたり、すべてのものをズームしたりできないため、これは完璧ではありません。スクロール可能!そして、それはひどいです!

すっごく、私の回避策は次のとおりです。

UIWebView の上にある UIView に乗って、JavaScript の助けを借りて魔法を手に入れましょう!

HTML では、最初にいくつかのトリックを実行する必要があります。ボディの直後にページ全体を含む div を作成し、パディングとマージンを 0 に設定します。これをdivに配置します:

これが行うことは、div をタップしたときにイベントを作成し、div が webview 全体を埋める場合、クリックするたびにそのイベントを呼び出し、そのイベントがアドレスを変更し、view controller を webview のデリゲートとして設定した場合です。 、デリゲートはこのメソッドを呼び出します:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString* scheme = request.URL.scheme;
    NSString* query = request.URL.query;
    NSLog(@"%@, %@", scheme, query);
    if ([scheme compare:@"file"]==0){
        if ([query isEqualToString:@"hideBars"]){
            [self hideBars];
            return NO;
        }
    }

    return YES;
}

ここで魔法が起こります。どこかをクリックすると、クエリ文字列が hideBars 文字列と共に表示されます。これで、hideBars 関数が呼び出されます。リンクをクリックすると、クエリにリンク アドレスが表示されるので、それも機能します。ズームはこのメソッドを呼び出さないので、すべて素晴らしいです!

ご不明な点がございましたら、goncalo.falcao @ waveweb2 までメールをお送りください。コム

于 2009-11-25T19:26:04.693 に答える