iOS 7 — navigationController设置了我的UIScrollView的contentInset和ContentOffset


69

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

Answers:


208

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

引入了此功能,iOS 7因此如果您需要支持iOS 6,请在iOS版本检查中进行包装。


更新资料

如果使用情节提要板,则可以在“界面生成器”中执行此操作,也可以通过检查'Adjust Scroll View Insets'选定的控制器来执行此操作。

在此处输入图片说明


7
仅当您使用情节提要板时,才可以在IB上进行设置。
jerrygdm

残酷的是IB显示此配置不正确;即使打开此标志,它也会在IB中显示为关闭标志。.如果您随后启动模拟器,则该标志将按预期工作,从而使您完全迷惑--.-邪恶的设置!:-)
Ursin Brunner

我花了一天的时间弄清楚为什么我的ImageView不在以scrollView为中心的左上角。关闭此选项后,一切正常!
张真一

1
“调整滚动视图插图”选项甚至可以做什么?
Yakiv Kovalskyi '16

@KDaker-我和Yakiv在同一条船上...这解决了我的问题(谢谢!!!),但我想首先知道该选项在做什么,并且没有找到任何好的信息别处。谢谢!
斯宾塞

25

我有一个类似的问题,解雇了一个viewController之后,我的tableView的contentOffset更改为(0,-64)。

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

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

之前

我将tableView移到ImageView之后,它可以正常工作:

后

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

PD我既没有使用autoLayout也没有使用故事板

希望这可以帮助某人!


这也是我的问题,iOS 7错误吗?
西里尔2014年

2
你是个明星!从来没有想过滚动视图的顺序可能是问题。
2014年

4
发生的原因由已接受的答案提示。UIViewController将自动设置第一个UIView的contentInset。通过将UITableView设置为第二个视图,将不会自动设置它的contentInset。
Michael McGuire 2014年

迈克尔,很遗憾,这不是事实。在我的情况下,控制器属性未选中(假),但我仍然有奇怪的插图。在viewWillAppear中将事件更改为0无效。但是将其移动到视图层次结构中很有帮助。真的很奇怪的错误。
米哈尔Hernas

谢谢!我从来没有发现过,为此,我实际上不得不向ViewController添加一个空视图。
布赖恩布莱恩

5

我有两种解决方案:

1。

self.view = scrollView;

2。

[self.navigationController.toolbar setTranslucent:NO];

1
感谢您的帮助,而不是toolbar在您的第二个示例中,我需要NavigationBarnavigationController.NavigationBar.Translucent = false;(注:Xamarin)那样工作。
ta.speot。是2015年

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;
        }
    }
    

0

这就够了

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;

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)
        }
    }
    

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调整后的视图,有时则不能。我将其标准化的方法是每次都手动对其进行调整。我希望将内容偏移到状态栏下方,因此我将状态栏高度用作值(负值,因为我希望将内容下推)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.