4

UIScrollViewにUIWebViewがあり、ページ付けされています。基本的に、スクロール/フリングジェスチャを使用して異なるWebビューを切り替えたいと思います。水平方向には問題なく動作します。Webビューが「ページの境界」までスクロールされると、scroll / panイベントがscrollviewに渡され、次のページが表示されます。縦軸では、これは機能しません。スクロールビューに渡されたイベントはないようです。イベントを消費すると思ったので、無効にしたバウンスに問題がある可能性があります。ただし、バウンスを無効にしても、これは機能しません。

以前、これをスクロールビューのTextViewsでテストしましたが、これも機能しました。Webビューの特別な動作である可能性があります。

何かアイデア、これをどのように機能させるのですか?イベントリスナーを実装し、イベントを手動でスクロールビューに渡す必要がありますか?

さらに、この種のレイアウトを実装する方法についてより良いアイデアがあれば、私に知らせてください。私が言ったように、私はさまざまなビューのグリッドを持ちたいと思っています。これは、フリング/スクロールジェスチャによって変更できます。AppStoreアプリと同様に、アプリの詳細を垂直方向にスクロールしたり、スクリーンショットを水平方向にスクロールしたりできます。

乾杯ヘンリック

4

3 に答える 3

9

それで、私はそれを理解しました。

最初に、webview のデリゲートを設定して、スクロール イベントを取得し、webview が上または下にスクロールされているかどうかを確認できるようにします。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if([scrollView isEqual:webView.scrollView]) {
        float contentHeight = scrollView.contentSize.height;
        float height = scrollView.frame.size.height;
        float offset = scrollView.contentOffset.y;

        if(offset == 0) {
            webViewScrolledToTop = true;
            webViewScrolledToBottom = false;
        } else if(height + offset == contentHeight) {
            webViewScrolledToTop = false;
            webViewScrolledToBottom = true;
        } else {
            webViewScrolledToTop = false;
            webViewScrolledToBottom = false;
        }

        //NSLog(@"Webview is at top: %i or at bottom: %i", webViewScrolledToTop, webViewScrolledToBottom);
    }
}

次に、追加のスワイプ ジェスチャ レコグナイザーを webview の scrollview に登録しました。

swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeUp)];
swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
swipeUp.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeUp];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp];
swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDown)];
swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
swipeDown.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeDown];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeDown];

への呼び出しに注目してください[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp];。それらがないと、webview のパン ジェスチャ レコグナイザーは、イベントがスワイプ ジェスチャ レコグナイザーに到達する前に常にイベントを消費するため、これらは絶対に必要です。これらの呼び出しは優先順位を変更します。

swipeUp メソッドと swipeDown メソッドでは、次の「ページ」の位置を計算し、実際に次のページがある場合は、親スクロール ビューをこの位置までスクロールします。

最後に、webview が上または下にスクロールされているかどうかを確認し、その場合にのみジェスチャーを受け入れるようにします。そのため、ジェスチャ認識エンジンのデリゲートを実装する必要があります。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if(gestureRecognizer == swipeUp) {
        return webViewScrolledToBottom;
    } else if(gestureRecognizer == swipeDown) {
        return webViewScrolledToTop;
    }

    return false;
}

非常に小さいため、まったくスクロールされない Web ページでこれを機能させるには、スクロール バウンスを無効にする必要がある場合もあります。webView.scrollView.bounces = false;

于 2012-06-09T14:17:59.367 に答える
4

それは本当に垂直にスクロールするスクロールビューですか、それともウェブビューですか? 私は自分で試したことはありませんが、おそらくこれが役立つでしょう...

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

また ...

webView.userInteractionEnabled = NO;
于 2012-06-06T07:44:42.813 に答える
2

以前にこれを行ったことがありますが、Javascript と Obj-c の使用を終了しました。ページがスクロールの下部または上部にあるかどうかを (JQuery を使用して) チェックする関数を追加しました (アプリに必要でした)。次に、次を使用して NSTimer でその関数を呼び出します。

NSString *str= [webView stringByEvaluatingJavaScriptFromString:@"JSFunction()"];

私はそれが醜いことを知っていますが、それが当時私が見つけた唯一の方法でした。使用したコードは次のとおりです。

function JSFunction() {
    var docHeight = $(document).height();
    var scroll    = $(window).height() + $(window).scrollTop();
    if (docHeight == scroll || $(window).scrollTop() < 10)
                 return "TOP";
            else
                 return "BODY";
}
于 2012-06-09T00:44:06.490 に答える