UIWebView scrollView在触摸时不调用scrollViewDidScroll

时间:2013-06-22 17:20:15

标签: ios uiwebview uiscrollview delegates scroll

我正在为iOS 6开发,我正在UIWebView顶部的一个工具栏上工作,当您在UIWebView上向上滚动时,它将退回。

我的想法是,我可以设置UIWebView内部的UIScrollView的委托,将消息发送到我的UIViewController,它将动画顶部工具栏上的约束,使其缩小和移动等等。

然而,似乎没有调用scrollViewDidScroll:方法,这让我感到困惑。

现在,关于SO的其他一些问题与此类似,其中大多数似乎是人们忘记在scrollView上设置委托属性...

毋庸置疑,我正在设置代表。一些代码片段:

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,并且调用了委托方法 。但这并不是很有用,因为我想检测用户何时用手势滚动。

那么,对此有何看法?为什么scrollView不会调用它的委托方法?

编辑:

所以,用Reveal查看我的应用程序,我看到我的UIWebView作为子视图有一个_UIWebViewScrollView,在它下面有一个UIWebBrowserView。 UIWebBrowserView的大小与UIWebView ...

的大小完全相同

可能是UIWebViewScrollView没有正常的内容视图,它有偏移等等,webkit正在进行滚动或其他什么?

2 个答案:

答案 0 :(得分:2)

由于UIWebView在内部实现UIScrollViewDelegate方法。 UIScrollViewDelegate不太可能被重新分配给除当前UIWebView对象之外的其他对象。 所以,我找到了一个小工作。您可以将UIWebView子类化为该类中的UIScrollViewDelegate方法,并且不要忘记将该方法转发给super,否则可能会发生意外行为。

这就是我解决上述问题的方法:

/////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方法将被调用

答案 1 :(得分:1)

即使答案很愚蠢,我也会回答我自己的问题。

与我一起工作的另一个人,他设置了UIWebView的内容,发现Web视图中的滚动视图没有正确滚动。因此,他禁用了Web视图上的滚动,然后在HTML中粘贴了-webkit-overflow-scrolling: touch;标记,这导致webkit滚动而不是Web视图 - 尽管看起来大致相同。他试图解决的原始问题是,无论出于何种原因,一些div都有CSS样式overflow:hidden;导致div实际上没有大小调整其内容,并使Web视图认为页面确实是很小,因此滚动不起作用。

我花了大约8个小时来解决这个问题,虽然我承认当我在网络开发方面缺乏知识时加入了时间,导致我真正地破解CSS样式表,直到我弄清楚什么属性导致div不能自动 - 大小到他们的内容。

无论如何,也许有一天这会帮助别人。