我正在为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正在进行滚动或其他什么?
答案 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不能自动 - 大小到他们的内容。
无论如何,也许有一天这会帮助别人。