1

私はiOS 6用に開発しています.UIWebViewを上にスクロールすると後退するUIWebViewの上部にある一種のツールバーに取り組んでいます。

私の考えでは、UIWebView 内にある UIScrollView のデリゲートを設定して、UIViewController にメッセージを送信できます。これにより、上部のツールバーの制約がアニメーション化され、縮小や移動などが行われます。

ただし、scrollViewDidScroll:メソッドが呼び出されないようで、混乱します。

さて、これに似たSOに関する他の質問がいくつかありますが、そのほとんどは、scrollViewでdelegateプロパティを設定するのを忘れているようです...

言うまでもなく、デリゲートを設定しています。いくつかのコード スニペット:

SDDefinitionViewController.h:

@interface SDDefinitionViewController : UIViewController <UIWebViewDelegate, UIScrollViewDelegate>
...

SDDefinitionViewController.m:

...
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self loadDefinitions];

    // Grab a reference to the ScrollView so that we can set the delegate and then use those method calls to animate the top bar.
    self.scrollView = self.webView.scrollView;
    self.scrollView.delegate = self;
    self.lastScrollViewVerticalOffset = 0;
}
...
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // (Code) <= Never gets called
}
...

さらに、デバッガー コンソールで次の操作を行いました。

(lldb) po self
$0 = 0x095c0600 <SDDefinitionViewController: 0x95c0600>
(lldb) po self.scrollView
$1 = 0x0954e8d0 <_UIWebViewScrollView: 0x954e8d0; frame = (0 0; 1024 596); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x954ec50>; layer = <CALayer: 0x954eab0>; contentOffset: {0, 0}>
(lldb) po self.scrollView.delegate
$2 = 0x095c0600 <SDDefinitionViewController: 0x95c0600>

したがって、デリゲートは間違いなく正しく設定されており、ランダムに解放されるものはありません。

最後に、プログラムで呼び出しsetContentOffsetたところself.scrollView、delegate メソッド呼び出されました。しかし、ユーザーがジェスチャーでスクロールしていることを検出したいので、それはあまり役に立ちません。

それで、これに関するスクープは何ですか?scrollView がそのデリゲート メソッドを呼び出さないのはなぜですか?

編集:

だから、私のアプリをRevealで見ると、私の UIWebView にはサブビューとして _UIWebViewScrollView があり、その下に UIWebBrowserView があることがわかります。UIWebBrowserView は UIWebView とまったく同じサイズです...

UIWebViewScrollView には、オフセットする通常のコンテンツ ビューがないなど、Webkit がスクロールなどを行っている可能性がありますか?

4

2 に答える 2

2

メソッドをUIWebView内部的に実装するため。が現在の UIWebView オブジェクト以外の他のオブジェクトに再割り当てされるUIScrollViewDelegate可能性は低いです。UIScrollViewDelegateそれで、私は小さな回避策を見つけました。UIWebView をサブクラス化UIScrollViewDelegateしてそのクラスのメソッドを実装し、メソッドをスーパーに転送することを忘れないでください。そうしないと、予期しない動作が発生する可能性があります。

これは私が上記の問題を解決した方法です:

/////in WebView.h file
//////WebView is subclass of UIWebView
#import <UIKit/UIKit.h>

@interface WebView : UIWebView
 @property(nonatomic,weak) NSObject <UIScrollViewDelegate> *mScrollDelegate;
@end

//// in WebView.m file
#import "WebView.h"
@synthesize mScrollDelegate;
@implementation WebView

- (id)init
{
    self = [super init];
    if (self) {
        self.scrollView.delegate = self;
    }
    return self;
}

/////scrollViewDidScroll Method, Also I am forwarding it to super class UIWebView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    [super scrollViewDidScroll:scrollView];
    if([self.mScrollDelegate respondsToSelector:@selector(scrollViewDidScroll:)]){
         [self.mScrollDelegate scrollViewDidScroll:scrollView];
    }
    NSLog(@"scrollViewDidScroll");
}

@end

そして、あなたself.webViewがタイプでなければならないことを確認してくださいWebView。SDDefinitionViewController.m 内

self.webView.mScrollDelegate = self;

これで、SDDefinitionViewController.m の scrollViewDidScroll メソッドが呼び出されます

于 2013-06-22T18:04:03.220 に答える
1

答えはばかげていますが、私は自分の質問に答えるつもりです。

UIWebView のコンテンツを設定した私と一緒にプロジェクトに取り組んでいる別の人は、Web ビュー内のスクロール ビューが正しくスクロールしていないことに気付きました。そのため、彼は Web ビューでのスクロールを無効にし、HTML で-webkit-overflow-scrolling: touch;タグをスタックしました。これにより、Web ビューではなく Webkit がスクロールしますが、外観はほぼ同じです。彼が解決しようとしていた最初の問題は、なんらかの理由で div の一部が CSS スタイルoverflow:hidden;を持っていたため、実際には div がコンテンツに合わせてサイズ変更されず、Web ビューにページが本当に小さいと思わせてしまうことでした。スクロールがうまくいきませんでした。

これを解決するのに約 8 時間かかりましたが、Web 開発の知識が不足していたため、CSS スタイルシートを文字通りハッキングして、どのプロパティが div の自動サイズ調整を行わないかを突き止めるまでに時間が追加されたことは認めます。それらの内容。

とにかく、おそらくいつかこれが誰かを助けるでしょう。

于 2013-06-23T02:36:55.587 に答える