我刚才注意到如果我把UIScrollView作为UIViewController的根视图:
- (void)loadView
{
self.view = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
}
我免费获得了很多行为:如果状态栏,导航栏或工具栏存在且半透明,则scrollView会自动设置contentInset
和scrollIndicatorInsets
,并在任何导航时更新属性布局改变:
[self.navigationController setNavigationBarHidden:YES animated:YES];
不幸的是,滚动视图在更改contentOffset
时也会自动更改contentsInset
,因此导航栏在导航栏出现时消失和向下时内容会上升。
我喜欢很多这种免费行为,但我希望我的内容在导航栏出现时保持静止,而我无法找到避免contentOffset
更改的位置。
修改
在一些堆栈跟踪之后,我发现了每次自动调整偏移时调用的方法:[UIScrollView(Static) _adjustContentOffsetIfNecessary]
;但由于我找不到任何关于这种方法的文件,我不知所措。
答案 0 :(得分:3)
好的,我找到了。 UIViewController有一个名为'automatedAdjustsScrollViewInsets'的属性,它在显示/隐藏navigationBar时更改contentOffset。将其设置为no以防止更改UIScrollView。
来源(和ios6解决方案):https://stackoverflow.com/a/20325593/936957
答案 1 :(得分:0)
您是否尝试在隐藏/显示导航栏时设置内容插入内容?
隐藏时喜欢这样:
[self.navigationController setNavigationBarHidden:YES animated:YES];
self.view.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height, 0, 0, 0);
并在显示时显示:
[self.navigationController setNavigationBarHidden:NO animated:YES];
self.view.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
系统不应更改AFAIK contentInset
,它会改变您应用的布局......
答案 2 :(得分:0)
我的解决方案是:
self.automaticallyAdjustsScrollViewInsets = NO;
viewDidload
中的。
而不是使用[UINavigationController setNavigationBarHidden:animated:]
,我使用:
self.navigationController.navigationBar.hidden = YES;//or NO
隐藏导航栏并避免更改contentOffset。
请记住将隐藏状态设置回viewDidDisappear
或适当的地方:
self.navigationController.navigationBar.hidden = NO