Change UIViewController self.view frame

21,589

Solution 1

Set the frame in viewWillAppear

- (void)viewWillAppear:(BOOL)animated
{
     self.view.frame = CGRectMake(0, 44, 320, 416);
    [super viewWillAppear:animated];
}

Solution 2

Just want to add a bit more. The reason for changing view of a UIViewController does not work in viewDidLoad is because of the call [window makeKeyAndVisible], which is usually called after your viewDidLoad. This call will change the frame of the window.rootViewController to equal the window's frame. You can test this by changing the UIViewController's view.frame AFTER [window makeKeyAndVisible], and the changes will stick.

viewWillAppear and viewDidAppear are called within [window makeKeyAndVisible] but after the view's frame got resized.

The caveat is that only the top most controller which is the rootViewController has its view's frame changed automatically. This DOES NOT affect any childViewControllers attached to the rootViewController.

Share:
21,589
Fabrizio Prosperi
Author by

Fabrizio Prosperi

Nothing special, just the usual iOS nerd stuff!

Updated on April 03, 2020

Comments

  • Fabrizio Prosperi
    Fabrizio Prosperi about 4 years

    I am trying to display a viewController xib view with its view displayed under a fixed header banner (0,0,320,44) which is an imageView added on Application window.

    This is because I need it to stick on the screen while I navigate multiple view controllers. Its a requirement of the project I am doing.

    So far I have tried:

    • Resizing the XIB view to the appropriate frame size (0,0,320,416), both with dot notation and setter.

    • Changing the frame in viewDidLoad with self.view.frame = CGRectMake(0, 44, 320, 416);

    but it is not working. Any suggestion?

  • Fabrizio Prosperi
    Fabrizio Prosperi about 12 years
    Yes, this works! Thanks, but why? The frame is not yet drawn in viewDidLoad? Just want to understand better, and also would love not to have to draw this every time the view appears.
  • Guntis Treulands
    Guntis Treulands almost 11 years
    I believe self.view.frame is overrided at the end of viewDidLoad (from iOS side), just before viewWillAppear call.
  • Lewen
    Lewen about 10 years
    it seems that what's also quite important is to set the frame before [super viewWillAppear];
  • Dhammini F.
    Dhammini F. almost 9 years
    Saved my life! Thanks!
  • Phong Nguyen
    Phong Nguyen over 8 years
    It doesn't work to me! in viewDidLoad, the frame is not changed