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];
我有同样的问题。
-
设置
self.automaticallyAdjustsScrollViewInsets = NO
解决了一些视图的问题,但并不是无处不在。 -
第二个解决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;
这解决了这两个情况下的问题:
- 显示状态栏
-
显示状态栏+导航栏
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) } }
其他答案可能适合你,但他们不适合我。 对我来说有效的是手动设置viewDidLayoutSubviews
和viewWillAppear
中的contentOffset
的y
属性:
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
调整和其他时间不。 我规范化的方式是每次只是手动调整它。 我想把内容偏移到状态栏的下面,所以我使用状态栏高度作为值(负数,因为我希望内容被按下)。