iOS 7 -- navigationController is setting the contentInset and ContentOffset of my UIScrollView

IosUiscrollviewUinavigationcontrollerIos7

Ios Problem Overview


I have a UIScrollView (actually a UICollectionView, but that probably doesn't matter). When it appears in IOS 7, the navigation controller sets its contentInset and contentOffset to values I don't want. It appears to be trying to adjust for the status bar and the navigation bar. I'd greatly prefer it left them alone. I've fixed this by overriding the getter and setter methods for contentInset and contentOffset, with a flag to tell the object whether or not it should accept a set. But is there a better way?

Ios Solutions


Solution 1 - Ios

Try setting self.automaticallyAdjustsScrollViewInsets = NO in your main view controller.

This was introduced in iOS 7 so you might want to wrap that with an iOS version check, if you are supporting iOS 6 and below.


Update

If you are using storyboards, you can do this in the Interface Builder as well as by checking 'Adjust Scroll View Insets' for your selected controller.

enter image description here

Solution 2 - Ios

I had a similar problem, after dismissing a viewController, the contentOffset from my tableView was changed to (0, -64).

my solution was a little weird, I tried all the other answers but had no success, the only thing that fixed my problem was to switch the tableView position in the controls tree of the .xib

it was the first control in the parent View like this:

before

I moved the tableView right after the ImageView and it worked:

after

it seems that putting the table view in the first position was causing the trouble, and moving the table view to another position fixed the problem.

P.D. I'm not using autoLayout neither storyboards

hope this can help someone!

Solution 3 - Ios

I have two solutions:

self.view = scrollView;
[self.navigationController.toolbar setTranslucent:NO];

Solution 4 - Ios

I'm having the same problem.

  1. Setting self.automaticallyAdjustsScrollViewInsets = NO solved the issue for some of the view but not everywhere.

  2. Second solution is to set the content-offset of tableview/view/scrollview in viewWillLayoutSubviews:

    - (void)viewWillLayoutSubviews {
        //Arrange the view
        CGRect tempViewFrame = self.view.frame;
    
        if (tempViewFrame.origin.y == 64.0f) {
            tempViewFrame.origin.y = 0;
            self.view.frame = tempViewFrame;
        }
    }
    

Solution 5 - Ios

This is enough

- (void)viewDidLoad {
    
    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;

Solution 6 - Ios

This fixes the issue on both cases when:

  1. Showing Status Bar

  2. Showing Status Bar + Navigation Bar

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

Solution 7 - Ios

The other answers may work for you, but they didn't work for me. What worked for me was to manually set the y property of the contentOffset in viewDidLayoutSubviews and 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
}

In my case, my controller had a child collection view which would sometimes get the contentOffset adjusted and other times not. The way I normalized it was to just manually adjust it every time. I wanted the content to be offset to below the status bar, so I used the status bar height as the value (negative because I want the content to be pushed down).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionWilliam JockuschView Question on Stackoverflow
Solution 1 - IosKDakerView Answer on Stackoverflow
Solution 2 - IosChuy47View Answer on Stackoverflow
Solution 3 - IosamazingthereView Answer on Stackoverflow
Solution 4 - IosSavvy iPhoneView Answer on Stackoverflow
Solution 5 - IosVladView Answer on Stackoverflow
Solution 6 - IosCarlos Javier A. HelgueroView Answer on Stackoverflow
Solution 7 - IosEric F.View Answer on Stackoverflow