每当我在我的webView中显示一个PDF文件时,看起来它的初始scrollview inset设置不正确,但是一旦我开始滚动或缩放,它就会跳转到正确的位置:/
PDF已加载,但它部分位于导航栏下方
一旦我开始滚动或放大,它就会捕捉到它的预定默认位置
如果我将PNG加载到同一个webview中,它们会有完美的插图并显示在导航栏的正下方(而不是中间的黑色像素线)。
有谁知道如何解决这个问题?
一些webView设置:
webView.clipsToBounds = NO;
webView.scalesPageToFit = YES;
答案 0 :(得分:7)
我实施了这个解决方法:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.15 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.webView.scrollView.contentOffset = CGPointMake(0, -(self.webView.scrollView.contentInset.top));
});
}
它"跳跃"加载WebView时有点,但至少正确设置了contentOffset。您可能还需要微调延迟(在此示例中为0.15 ms)。
答案 1 :(得分:2)
我遇到了同样的问题;很烦人。我能够通过首先使我的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也是动态确定的。