我很难理解委托和对象继承(如果我可以使用这个单词),我认为我需要一个简单的(或者我认为)的东西:在UIWebView中捕获scrollViewDidScroll事件并获得偏移(基本上,只是要知道滚动不在顶部/底部,所以我可以隐藏导航和标签栏。
我有什么方法可以做到吗?我已经在视图控制器中使用UIWebviewDelegate来“shouldStartLoadWithRequest”。也许我可以使用UIScrollViewDelegate如何使用scrollViewDidScroll?如果是,那怎么办?
我真的很难理解代表。我发布了一些文章,但实际上,我还是无法使用它们。
任何帮助或信息都很可爱。
提前谢谢!
答案 0 :(得分:13)
要在UIWebView上检索滚动事件,我个人使用此代码来获取UIWebView内的滚动视图:
- (void) addScrollViewListener
{
UIScrollView* currentScrollView;
for (UIView* subView in self.myWebView.subviews) {
if ([subView isKindOfClass:[UIScrollView class]]) {
currentScrollView = (UIScrollView*)subView;
currentScrollView.delegate = self;
}
}
}
它正在运作。您也可以使用它来呼叫[currentScrollView setContentOffset:offSet animated:YES];
唯一的问题可能是没有通过Apple代码检查。我还不知道,因为我还处于编码阶段。
[更新]具有此代码的应用程序现在在应用商店中存在4个月,并由40,000个用户使用。我没有遇到任何麻烦[更新]
答案 1 :(得分:7)
您可以使用以下方法解决问题。
int pageYOffset = [[webViewObj stringByEvaluatingJavaScriptFromString:@“window.pageYOffset”] intValue];
int scrollHeight = [[webViewObj stringByEvaluatingJavaScriptFromString:@“document.documentElement.scrollHeight”] intValue];
[webViewObj stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@“document.body.scrollTop =%d”,scrollHeight]];
答案 2 :(得分:4)
我做了一个修改,用isKindOfClass检测类。有效 - 但可能与上述Apple代码检查有关。
UIScrollView* currentScrollView;
for (UIView* subView in terms.subviews) {
if ([subView isKindOfClass:[UIScrollView class]]) {
NSLog(@"found scroll view");
currentScrollView = (UIScrollView *)subView;
currentScrollView.delegate = self;
}
}
答案 3 :(得分:4)
旧线程,我知道 -
从iOS 5.0开始,您可以使用
myAccountWebView.scrollview
访问内容大小和偏移量。
答案 4 :(得分:2)
UIWebView
中有一个滚动视图,但它a)不是UIScrollView
,而b)是Apple认为是私有实现细节的东西(你也应该这样)。我只有两个建议:
#2的基本基础是加载虚假URL,并加载您的Web视图委托进程(并中止!)。 (这个问题在Stack Overflow上已经出现过几次了。)
<强>更新强>
从iOS 5开始,现在可以使用public scrollView
property on UIWebView
来自定义滚动行为。 Web视图的确切视图层次结构仍然是一个未记录的实现细节,但是这为您提供了一种获得批准的方法来访问它。
答案 5 :(得分:1)
这是一个很好的问题。 UIWebView不是UIScrollView的子类,虽然我可以看到为什么有人会认为它是。这意味着使用UIScrollViewDelegate方法不是执行所需操作的选项,UIWebViewDelegate协议不响应那些滚动事件类型的消息。我不认为在Web视图中检测滚动事件有一种简单的方法。
答案 6 :(得分:1)
我厌倦了委托方法,发现它在键盘显示时阻止了视图的滚动。我发现通过添加一个观察者,你不会覆盖当前的委托,并且会阻止你影响webview性能。
for (UIView* subView in myAccountWebView.subviews) {
if ([subView isKindOfClass:[UIScrollView class]])
{
NSLog(@"found scroll view");
[((UIScrollView*)subView) addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
}
}