我有一个在导航栏下方根据需要滚动的 web 视图。
但是,当我第一次加载控制器时,webview 中加载的页面会滚动,使其与导航栏的顶部对齐。当我滚动 web 视图时,正确的插图出现在顶部以正确放置,只是初始位置不正确。
如何让初始位置完全滚动到顶部,包括插图?
我有一个在导航栏下方根据需要滚动的 web 视图。
但是,当我第一次加载控制器时,webview 中加载的页面会滚动,使其与导航栏的顶部对齐。当我滚动 web 视图时,正确的插图出现在顶部以正确放置,只是初始位置不正确。
如何让初始位置完全滚动到顶部,包括插图?
如果您不介意有一个不透明的导航栏,那么最简单的解决方案可能是在包含您的 Web 视图的视图控制器中执行此操作:
self.navigationController.navigationBar.translucent = NO;
然后框架的定位将采用与 iOS6 相同的行为,神奇地!
里克的回答是正确的,除了最高值应该是负数,这对我有用!
[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。
我解决这个问题的方法是使用 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];
我有同样的问题并修复了它。解决方案非常简单:
转到情节提要,选择包含您的 UIWebView 的视图控制器并打开 Attributes Inspector。在这里,您会看到标题“Extend Edges”,只需取消选中“Under Top Bars”框,我就会工作!
希望这可以帮助 !
我的解决方案:
- (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;
}
使用以下
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
CGFloat navHeight = self.navigationController.navigationBar.frame.size.height;
applicationFrame.origin.y = navHeight + 4;
webView = [[UIWebView alloc] initWithFrame:applicationFrame];
您还可以在 中设置 webview 的滚动视图的内容偏移量viewDidAppear:
,例如:
[self.webView.scrollView setContentOffset:CGPointMake(0, -64) animated:NO];
不幸的是,如果放置在 中,它没有任何效果viewWillAppear:
,因此当视图出现时,您会在内容中看到可见的跳转,因为它从导航栏下方转移到新位置。
对于@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];
}