我遇到了同样的问题;很烦人。我可以通过首先将我的 WebViewController 设置为 UIScrollViewDelegate 来解决它。
@interface WebViewController () <UIWebViewDelegate, UIScrollViewDelegate>
当我在 scrollViewDidScroll 委托中添加一些调试以检查某些属性并查看发生了什么时,我能够观察到框架将我的内容偏移量重新调整为 CGPointZero(这导致它位于导航栏后面)。通过检查该条件,您基本上可以通过立即重置来取消效果。
所以一旦 UIWebView 完成加载,我会根据导航栏和状态栏的高度计算我需要的实际插图。
- (void)webViewDidFinishLoad:(UIWebView *)webView {
webView.scrollView.delegate = self;
float inset = self.navigationController.navigationBar.bounds.size.height +
[UIApplication sharedApplication].statusBarFrame.size.height;
webView.scrollView.contentInset = UIEdgeInsetsMake(inset, 0.0, 0.0, 0.0);
}
然后,每当我检测到滚动时,我就会阻止偏移量取消我的 contentInset。我在用户缩放时排除了这种影响,因此如果用户碰巧落在此边界上,文档就不会跳来跳去。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if(scrollView.contentOffset.y == 0 && !scrollView.zooming)
[scrollView setContentOffset:CGPointMake(0.0, -(scrollView.contentInset.top))];
}
这里的优点是您不需要依赖任何计时元素,并且在调度执行时您不会看到 PDF 跳转。您需要的实际 contentInset 也是动态确定的。