iOS7 UIWebView在初始加载时有错误的scrollview插入

时间:2014-07-30 15:37:41

标签: ios7 uiwebview uiscrollview

每当我在我的webView中显示一个PDF文件时,看起来它的初始scrollview inset设置不正确,但是一旦我开始滚动或缩放,它就会跳转到正确的位置:/

PDF已加载,但它部分位于导航栏下方 The PDF is loaded but it's partially under the navigation bar

一旦我开始滚动或放大,它就会捕捉到它的预定默认位置 As soon as I start scrolling or zooming in, it snaps to it's intended default position

如果我将PNG加载到同一个webview中,它们会有完美的插图并显示在导航栏的正下方(而不是中间的黑色像素线)。

有谁知道如何解决这个问题?

一些webView设置:

webView.clipsToBounds = NO;
webView.scalesPageToFit = YES;

2 个答案:

答案 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也是动态确定的。