UIWebView不调用UIScrollViewDelegate方法

在我的iphone应用程序,我设置我的uiwebview委托给文件的所有者,但它不是调用uiscrollviewdelegate方法

我的代码是

- (void)webViewDidStartLoad:(UIWebView *)webView{ NSLog(@"webViewDidStartLoad "); } - (void)webViewDidFinishLoad:(UIWebView *)webView{ NSLog(@"webViewDidFinishLoad "); } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidEndDecelerating "); } - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScroll "); } 

但我越来越

 webViewDidStartLoad webViewDidFinishLoad 

这些消息在控制台中。

有什么不对吗

提前致谢

UIWebViewdelegate属性只允许你设置UIWebViewDelegate协议的委托。 ( 在这里寻找UIWebView参考。)

UIWebView本身就是一个UIScrollViewDelegate ,它从它所包含的UIScrollView接收委托调用。 不幸的是,你没有这个UIScrollView API访问权限,所以你不能改变它的委托。 因此,它仍然是硬编码到UIWebView本身。

现在,有几种方法可以尝试获取这些委托消息。

一个方法让你得到UIScrollViewDelegate调用是子类化UIWebView ,如果有效的话。 无论如何,你应该非常小心,因为根据你做什么,你可能会破坏UIWebView完整性,一些function可能会停止工作(可能还有一些未来的SDK版本)。 此外,苹果公司不鼓励这样做,尽pipe它不会让你的应用程序被拒绝(许多人已经报道了这一点,并没有问题的应用程序商店批准)。

另一种方法是遍历UIWebViewsubviews ,直到findUIScrollView对象,然后更改其委托。

 UIScrollView* scrollView = nil; for (UIView* subview in [webView subviews]) { if ([subview isKindOfClass:[UIScrollView class]]) { scrollView = (UIScrollView*)subview; scrollView.delegate = <YOUR_DELEGATE_HERE>; break; } } 

我不知道这是可靠的,或者可能会破坏任何东西,因为UIWebView和它的UIScrollViewUIWebView之间的耦合是非常紧密的,没有描述任何地方,但你可以尝试一下。 总而言之,我不认为这比UIWebView子类更好。

最后,第三种方法是定义你自己的UIWindowtypes。 这将允许您重写几个关键方法( sendEventhitTest:event: sendEvent ,以便可以在视图级别分派sendEvent 之前拦截它们。 这将给你一个机会来处理它们,并在必要时阻止它们达到原来的目标。

这是最干净的解决scheme,虽然它是更多的工作,它会要求你定义一个自定义的UIWindow ,你做所有的触摸识别/调度。

描述如何覆盖sendEvent教程可以在这里find 。

对于那些正在关注SWIFT 3解决scheme的人员:

设置UIScrollViewDelegate然后这里是一个例子:

 var noticias: UIWebView! noticias.scrollView.delegate = self 

UIWebView有它自己的UIScrollView.Maybe你可以尝试像这样self.webView.scrollView.delegate = self;

UIWebView的scrollView实际上有一个可写的委托属性,因为iOS2。 这对我来说是完美的使用它。