iOS 7 – navigationController设置我的UIScrollView的contentInset和ContentOffset

我有一个UIScrollView(实际上是一个UICollectionView,但可能无所谓)。 当它出现在IOS 7中时,导航控制器将其contentInset和contentOffset设置为我不想要的值。 它似乎在尝试调整状态栏和导航栏。 我非常喜欢这让他们孤单。 我已经通过覆盖contentInset和contentOffset的getter和setter方法解决了这个问题,用一个标志来告诉对象是否应该接受一个set。 但有没有更好的办法?

尝试在您的主视图控制器中设置self.automaticallyAdjustsScrollViewInsets = NO

这是在iOS 7中引入的,因此如果您支持iOS 6及更低版本,则可能需要使用iOS版本检查进行打包。


更新

如果您正在使用故事板,则可以在界面构build器中执行此操作,并通过选中所选控制器的'Adjust Scroll View Insets'来执行此操作。

在这里输入图像说明

我有一个类似的问题,closuresviewController后,我的tableView的contentOffset被更改为(0,-64)。

我的解决scheme有点奇怪,我尝试了所有其他的答案,但没有成功,唯一解决我的问题是切换.xib控件树中的tableView位置

这是在父视图中的第一个控件像这样:

之前

我在ImageView之后移动了tableView,它工作正常:

后

似乎把表视图放在第一个位置是造成麻烦,并将表视图移动到另一个位置解决了问题。

PD我没有使用autoLayout都不是故事板

希望这可以帮助别人!

我有两个解决scheme:

1。

 self.view = scrollView; 

2。

 [self.navigationController.toolbar setTranslucent:NO]; 

我有同样的问题。

  1. 设置self.automaticallyAdjustsScrollViewInsets = NO解决了一些视图的问题,但并不是无处不在。

  2. 第二个解决scheme是在viewWillLayoutSubviews中设置tableview / view / scrollview的内容偏移量:

     - (void)viewWillLayoutSubviews { //Arrange the view CGRect tempViewFrame = self.view.frame; if (tempViewFrame.origin.y == 64.0f) { tempViewFrame.origin.y = 0; self.view.frame = tempViewFrame; } } 

这就够了

 - (void)viewDidLoad { [super viewDidLoad]; self.automaticallyAdjustsScrollViewInsets = NO; 

这解决了这两个情况下的问题:

  1. 显示状态栏
  2. 显示状态栏+导航栏

     override func viewDidLayoutSubviews() { NSLog("ORIGIN: \(self.view.frame.origin.y)") if self.view.frame.origin.y == 0 { if let rect = self.navigationController?.navigationBar.frame { let y = rect.size.height + rect.origin.y self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0) } } else if self.view.frame.origin.y == 44 || self.view.frame.origin.y == 64 { self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) } } 

其他答案可能适合你,但他们不适合我。 对我来说有效的是手动设置viewDidLayoutSubviewsviewWillAppear中的contentOffsety属性:

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Set the offset to go below the status bar collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Set the offset to go below the status bar collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height } 

在我的情况下,我的控制器有一个儿童收集视图,有时会得到contentOffset调整和其他时间不。 我规范化的方式是每次只是手动调整它。 我想把内容偏移到状态栏的下面,所以我使用状态栏高度作为值(负数,因为我希望内容被按下)。