全屏 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];
更新:我注意到发生变化的是 contentOffset
和 contentInset
,而不是 scrollViews
框架。当条形消失并且UIScrollView
是屏幕的全尺寸(应该是)时,contentOffset
和contentInset
如下:
Content Offset: 0, -20
Content Inset: 20, 0, 44, 0
当条形可见且UIScrollView
被按下时,contentOffset
和contentInset
如下:
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 将无法正常工作