iOS 7 - navigationController正在设置我的UIScrollView的contentInset和ContentOffset

时间:2013-09-20 19:28:57

标签: ios uiscrollview uinavigationcontroller ios7

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

7 个答案:

答案 0 :(得分:208)

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

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


<强>更新

如果您使用的是故事板,则可以在Interface Builder中执行此操作,也可以选中所选控制器的'Adjust Scroll View Insets'

enter image description here

答案 1 :(得分:25)

我遇到了类似的问题,在解除了一个viewController后,我的tableView中的contentOffset被更改为(0,-64)。

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

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

before

我在ImageView之后移动了tableView,它运行起来了:

after

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

Pd积。我没有使用autoLayout,也没有使用故事板

希望这可以帮助别人!

答案 2 :(得分:5)

我有两个解决方案:

1

self.view = scrollView;

2

[self.navigationController.toolbar setTranslucent:NO];

答案 3 :(得分:2)

我遇到了同样的问题。

  1. 设置self.automaticallyAdjustsScrollViewInsets = NO解决了部分视图的问题,但并未解决所有问题。

  2. 第二个解决方案是在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)

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

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

答案 6 :(得分:0)

其他答案可能适合您,但它们对我不起作用。对我有用的是在ycontentOffset中手动设置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。我将其标准化的方式是每次只需手动调整它。我希望内容偏移到状态栏下方,因此我使用状态栏高度作为值(否定因为我希望将内容下推)。