我有一个UIScrollView(实际上是一个UICollectionView,但这可能并不重要)。当它出现在IOS 7中时,导航控制器将其contentInset和contentOffset设置为我不想要的值。它似乎正在尝试调整状态栏和导航栏。我非常喜欢让他们独自一人。我已经通过覆盖contentInset和contentOffset的getter和setter方法来解决这个问题,并使用一个标志来告诉对象它是否应该接受一个集合。但是有更好的方法吗?
答案 0 :(得分:208)
尝试在主视图控制器中设置self.automaticallyAdjustsScrollViewInsets = NO
。
这是在iOS 7
中引入的,因此如果您支持iOS 6
及以下,则可能需要使用iOS版本检查进行包装。
<强>更新强>
如果您使用的是故事板,则可以在Interface Builder中执行此操作,也可以选中所选控制器的'Adjust Scroll View Insets'
。
答案 1 :(得分:25)
我遇到了类似的问题,在解除了一个viewController后,我的tableView中的contentOffset被更改为(0,-64)。
我的解决方案有点奇怪,我尝试了所有其他答案但没有成功,解决我的问题的唯一办法就是在.xib的控件树中切换tableView位置
它是父视图中的第一个控件,如下所示:
我在ImageView之后移动了tableView,它运行起来了:
似乎将表格视图放在第一个位置会导致麻烦,并将表格视图移动到另一个位置可以解决问题。
Pd积。我没有使用autoLayout,也没有使用故事板
希望这可以帮助别人!答案 2 :(得分:5)
我有两个解决方案:
1
self.view = scrollView;
2
[self.navigationController.toolbar setTranslucent:NO];
答案 3 :(得分:2)
我遇到了同样的问题。
设置self.automaticallyAdjustsScrollViewInsets = NO
解决了部分视图的问题,但并未解决所有问题。
第二个解决方案是在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;
}
}
答案 4 :(得分:0)
这就够了
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
答案 5 :(得分:0)
这解决了以下两种情况下的问题:
显示状态栏+导航栏
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)
}
}
答案 6 :(得分:0)
其他答案可能适合您,但它们对我不起作用。对我有用的是在y
和contentOffset
中手动设置viewDidLayoutSubviews
的{{1}}属性:
viewWillAppear
在我的情况下,我的控制器有一个子集合视图,有时会调整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
。我将其标准化的方式是每次只需手动调整它。我希望内容偏移到状态栏下方,因此我使用状态栏高度作为值(否定因为我希望将内容下推)。