全屏 UIScrollView 无法正常工作

Posted

技术标签:

【中文标题】全屏 UIScrollView 无法正常工作【英文标题】:Full Screen UIScrollView not working Correctly 【发布时间】:2012-06-05 19:37:13 【问题描述】:

我有一个应用程序,例如照片应用程序,其中主视图是 UIScrollView,它占据了整个屏幕大小。此外,与照片应用程序一样,当用户点击屏幕时,会出现半透明的导航、状态和工具栏,它们会重新出现/消失。

我在将UIViewControllers 主视图设置为UIScrollView 并让它占据整个屏幕时遇到问题。问题是当显示导航栏和状态栏时,UIScrollView 会被导航栏和状态栏的高度向下推(它不会像预期的那样位于它们下方)。当用户点击屏幕并且导航/状态栏消失时,它会自行重置以占据屏幕的整个长度,就像它假设的那样。

将主视图设置为UIView 并在其顶部附加UIScrollView 的简单解决方法。但是,我想尝试让它在没有任何变通方法的情况下工作(即调整UIScrollViews contentInset 等),因为理论上它应该可以工作。

下面是我正在实现的代码:

- (void)loadView


    self.wantsFullScreenLayout = YES;

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame: CGRectMake(0,0,320,480)];
    scrollView.contentSize = CGSizeMake(320, 480);
    scrollView.scrollEnabled = NO;
    scrollView.contentOffset = CGPointZero;
    scrollView.bounces = NO;
    self.view = scrollView;
    [scrollView release];



- (void) viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    self.navigationController.navigationBar.translucent = YES;
    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent animated: NO];
    self.navigationController.toolbarHidden = NO;
    self.navigationController.toolbar.barStyle = UIBarStyleBlack;
    self.navigationController.toolbar.translucent = YES;

    [self startTimer];


- (void) viewWillDisappear:(BOOL)animated

    [super viewWillDisappear:animated];

    self.navigationController.navigationBar.translucent = NO;
    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleDefault animated: NO];

    [self cancelTimer];

更新:我注意到发生变化的是 contentOffsetcontentInset,而不是 scrollViews 框架。当条形消失并且UIScrollView 是屏幕的全尺寸(应该是)时,contentOffsetcontentInset 如下:

Content Offset: 0, -20
Content Inset: 20, 0, 44, 0

当条形可见且UIScrollView被按下时,contentOffsetcontentInset如下:

Content Offset: 0, -64
Content Inset: 64, 0, 44, 0

【问题讨论】:

【参考方案1】:

阅读 Apple 的 UI 过渡指南后,我在 ios7 上解决了类似的问题: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

原来UIViewController 有一个automaticallyAdjustsScrollViewInsets 布尔属性。 默认为 true,禁用它会使我的 UIScrollView 填满整个窗口,而不是被向下推。

【讨论】:

【参考方案2】:

我就此与 DTS 进行了交谈,他们说这是设计行为,并建议将 UIScrollView 附加到父 UIView

【讨论】:

祝福你!我只是为此撕毁了我的头发。【参考方案3】:

尝试设置:

self.view.frame = CGRectMake(0.f, -44.f, 320.f 480.f);

它可能不是你想要的大小,但你可以调整它......

【讨论】:

我更新了,改变的是 contentOffset 而不是框架。我知道我可以调整 contentOffset 来弥补这一点,但试图找到更好的解决方案。 我认为没有比覆盖导航控制器自动更改的某些值更好的解决方案了。它可以是框架或内容偏移量。您可以为 self.view 使用普通 UIView,然后将 UIScrollView 添加为子视图并使用框架或 contentOffset,但没有像 resizeMyControllersMainView 这样的通用属性将其设置为 NO...

以上是关于全屏 UIScrollView 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 在视图中设置 contentoffset 将无法正常工作

用UIScrollView缩放时,无法正常滚动到下端

UIScrollView 无法正常工作(它返回顶部并且不显示任何滚动条

无法让 UIScrollView 工作

UIScrollview 第二次无法正确显示

ios中给uiscrollview添加的全屏子视图为啥宽度只显示屏幕的一半