UIScrollView和UINavigationController交互

时间:2011-10-22 23:32:15

标签: ios uikit

我刚才注意到如果我把UIScrollView作为UIViewController的根视图:

- (void)loadView
{
    self.view = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
}

我免费获得了很多行为:如果状态栏,导航栏或工具栏存在且半透明,则scrollView会自动设置contentInsetscrollIndicatorInsets,并在任何导航时更新属性布局改变:

[self.navigationController setNavigationBarHidden:YES animated:YES];

不幸的是,滚动视图在更改contentOffset时也会自动更改contentsInset,因此导航栏在导航栏出现时消失和向下时内容会上升。

我喜欢很多这种免费行为,但我希望我的内容在导航栏出现时保持静止,而我无法找到避免contentOffset更改的位置。

修改

在一些堆栈跟踪之后,我发现了每次自动调整偏移时调用的方法:[UIScrollView(Static) _adjustContentOffsetIfNecessary];但由于我找不到任何关于这种方法的文件,我不知所措。

3 个答案:

答案 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