iOS8 - After pushing a UIViewController on a UINavigationController and rotating the device, the size is wrong in previous view controller
Asked Answered
A

2

7

I have a UINavigationController with a root UIViewController ("root").

The root view controller pushes another UIViewController "child". When the "child" UIViewController is on the screen , I rotate the device and expect the "root" view controller to resize accordingly but this isn't happening. After putting a breakpoint in the root view controller:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

I see that the size is wrong and the root view controller doesn't adjust properly to the change.

Has any one experienced this behaviour?

The code is as so:

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];


}

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
/// The size is wrong if this view controller is off screen
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

enter image description here

Here is a print screen of the NSLog of the size after rotating the device - This is from the simulator but the behaviour is the same on the device.

enter image description here

Afterthought answered 12/11, 2014 at 15:12 Comment(6)
What's your size log, what do you expect?Oof
I'll add a print screen - after I had rotated the device a few times. Notice that the size is always the same.Afterthought
Yes,it is always the same size, it looks like root View controller doesn't rotate at all.Oof
Yes. Seems like a bugAfterthought
@AvnerBarr how did you fix this issue? I am porting some code from the previous will/didRotate to the new viewWillTransitionToSize. I am using a UINavigationController for a drill down navigation and I need to do some things in all the stacked controllers when the device is rotated.Ashe
I didn't solve it, more of a work around. I added auto layout code to the views and then they were positioned correctly - disappointing that the obvious methods don't work. (Especially if you had views without their source code)Afterthought
R
2

Same issue on my project. It seems that UINavigationController and UITabBarController (maybe all viewController?) give to there children the wrong size when you call :

'[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];'

I fixed the issue by overriding 'viewWillTransitionToSize:withTransitionCoordinator:' in my tabBarController and navigation bar controller subclass (same code in both).

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    for (UIViewController* aViewController in self.viewControllers)
    {
        [aViewController viewWillTransitionToSize:size
                        withTransitionCoordinator:coordinator];
    }

    if ([self presentedViewController])
    {
        [[self presentedViewController] viewWillTransitionToSize:size
                                       withTransitionCoordinator:coordinator];
    }
}

I'm not sure this is the best way, if you found something better, tell me please.

Rocha answered 23/2, 2015 at 13:52 Comment(0)
O
0

Possibly that only the window rotate. If you print it like this, it is always correct as I have tested.

[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
 {

 } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
 {
     UIWindow *screen = [[[UIApplication sharedApplication] delegate] window];
     CGSize mainWindowSize = screen.bounds.size;
     NSLog(@"Main window size is %@",NSStringFromCGSize(mainWindowSize));

 }];
Oof answered 12/11, 2014 at 15:57 Comment(3)
That's a hack. I don't want to put that in 20 view controllersAfterthought
All that is is dumping out the current size to the log. Nothing effected yet in this code.Phosphoprotein
@NormanH, this code works for me, it is put in the previous view controller, which view is off screen, if you rotate the current view, the logs is right.Oof

© 2022 - 2024 — McMap. All rights reserved.