iOS7 Webview初始滚动位置在导航栏下

时间:2013-09-26 09:13:56

标签: ios7

我有一个webview,可以根据需要滚动导航栏。

但是,当我第一次加载控制器时,滚动webview中加载的页面,使其与导航栏的顶部对齐。当我滚动网页视图时,顶部存在正确的插图以正确放置,这只是初始位置不正确。

如何让初始位置完全滚动到顶部,包括插图?

8 个答案:

答案 0 :(得分:13)

如果您不介意使用不透明的导航栏,那么最简单的解决方案可能是在包含您的Web视图的视图控制器中执行此操作:

self.navigationController.navigationBar.translucent = NO;

框架的定位将采用与iOS6相同的行为,神奇地!

答案 1 :(得分:6)

Rick的回答是正确的,除了最高值应为负值,这对我有用!

[self.webView.scrollView setContentInset:UIEdgeInsetsMake(-44, 0, 0, 0)];
[self.webView.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(-44, 0, 0, 0)];
[self.webView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

我使用-44,如果顶部没有状态栏,则应使用-64。

答案 2 :(得分:4)

我解决此问题的方法是使用webViewDidFinishLoad委托回调。在Web视图的回调方法中,我设置了所有工作,使Web视图的滚动视图看起来正确。

[webView.scrollView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];
[webView.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(64, 0, 0, 0)];
[webView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

答案 3 :(得分:3)

我有同样的问题并修复了它。解决方案非常简单:

转到故事板,选择包含UIWebView的视图控制器并打开Attributes Inspector。在这里,你会看到标题“Extend Edges”,只需取消选中“Under Top Bars”框,我就可以了!

希望这有帮助!

答案 4 :(得分:1)

使用以下

CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
CGFloat navHeight = self.navigationController.navigationBar.frame.size.height;
applicationFrame.origin.y = navHeight + 4;
webView = [[UIWebView alloc] initWithFrame:applicationFrame];

答案 5 :(得分:1)

您还可以在viewDidAppear:中设置webview的滚动视图的内容偏移量,例如:

[self.webView.scrollView setContentOffset:CGPointMake(0, -64) animated:NO];

不幸的是,如果放在viewWillAppear:中,它就没有效果,所以当视图出现时,当内容从导航栏下方移动到新位置时,您会看到内容中的可见跳转。

答案 6 :(得分:0)

我的解决方案:

- (void)loadView {
    ...

    _offsetSet = NO;
}

- (void) viewDidLayoutSubviews {

    if (!_offsetSet) {
        [_webView.scrollView setContentOffset:CGPointMake(0, -self.topLayoutGuide.length) animated:NO];
    }
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    _offsetSet = YES;
}

答案 7 :(得分:0)

对于@ Puran的答案的更一般版本,而不是44或64的硬连线,从topLayoutGuide获取它。此外,如果您多次加载,则只需更改一次这些值:

UIEdgeInsets insets = self.myWebView.scrollView.contentInset;
if ( UIEdgeInsetsEqualToEdgeInsets(insets, UIEdgeInsetsZero)) {
    insets.top = -self.topLayoutGuide.length;
    [self.myWebView.scrollView setContentInset:insets];
    [self.myWebView.scrollView setScrollIndicatorInsets:insets];
    [self.myWebView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
}