69

我有一个 UIScrollView(实际上是一个 UICollectionView,但这可能没关系)。当它出现在 IOS 7 中时,导航控制器将其 contentInset 和 contentOffset 设置为我不想要的值。它似乎正在尝试调整状态栏和导航栏。我非常希望它让他们一个人呆着。我已经通过覆盖 contentInset 和 contentOffset 的 getter 和 setter 方法来解决这个问题,并带有一个标志来告诉对象它是否应该接受一个集合。但是有更好的方法吗?

4

7 回答 7

208

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

这是引入的,iOS 7因此如果您支持以下版本,您可能希望使用 iOS 版本检查来包装它iOS 6


更新

如果您正在使用情节提要,您可以在 Interface Builder 中执行此操作,也可以通过检查'Adjust Scroll View Insets'您选择的控制器来执行此操作。

在此处输入图像描述

于 2013-09-20T19:31:58.817 回答
25

我遇到了类似的问题,在关闭 viewController 后,tableView 的 contentOffset 更改为 (0, -64)。

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

它是父视图中的第一个控件,如下所示:

前

我在 ImageView 之后移动了 tableView 并且它起作用了:

后

似乎将表格视图放在第一个位置会引起麻烦,将表格视图移动到另一个位置可以解决问题。

PD我没有使用自动布局也没有故事板

希望这可以帮助某人!

于 2014-04-11T19:33:26.287 回答
5

我有两个解决方案:

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];
于 2015-01-27T08:19:14.937 回答
2

我有同样的问题。

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

  2. 第二种方案是在viewWillLayoutSubviews中设置tableview/view/scrollview的content-offset:

    - (void)viewWillLayoutSubviews {
        //Arrange the view
        CGRect tempViewFrame = self.view.frame;
    
        if (tempViewFrame.origin.y == 64.0f) {
            tempViewFrame.origin.y = 0;
            self.view.frame = tempViewFrame;
        }
    }
    
于 2016-06-22T10:54:53.383 回答
0

这就够了

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;
于 2015-08-22T17:00:12.597 回答
0

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

  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)
        }
    }
    
于 2016-07-04T18:34:48.900 回答
0

其他答案可能对你有用,但对我没有用。对我有用的是手动设置in和的y属性:contentOffsetviewDidLayoutSubviewsviewWillAppear

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调整,有时不会。我标准化的方式是每次手动调整它。我希望内容偏移到状态栏下方,所以我使用状态栏高度作为值(负数,因为我希望内容被下推)。

于 2017-07-25T14:43:03.220 回答